14用d程式設計函式引數

2021-10-03 23:07:29 字數 2657 閱讀 2185

引數,始終複製引數,除非加了ref(c++的&).

即使是引用型別(切片,關聯陣列,類)也是複製的,當然,複製的是鑰匙.實體未複製.因此,通過它是可以直接修改原實體的.因為鑰匙的能力是很強的.

當然通過值傳遞,因為複製的都是鑰匙.

但切片,不僅僅是鑰匙,一但增加超過容量.鑰匙變實體,這個時候,原來的實體就不會變.

所以,對於切片,要加引用才能只用原來的引用.

同樣:關聯陣列,初化時是個無效針.同樣,將關聯陣列按ref傳遞好,不然,什麼時候鑰匙變實體,你也搞不清楚.

d語言切片比較複雜.

無效意味著未初化(乙個空指標).當新增第乙個時,才建立實體.因而:

import std.stdio;

void

(int

[string] aa)

void

main()

即除了鑰匙變實體外,還有空針變實體,就是為了點初化.說實話,懶初化有的時候,沒多大意義,節約不了啥.

因而,關聯陣列,類,切片最好都按引用傳遞引數.

值型別都是複製的.雖然可能複製的都是鑰匙.或者可能複製的是空針.

引用型別有的複製的是鑰匙,所以,你看見的仍然在原有實體上操作.

有的複製的是空針,這時,還沒有建立起實體,你在函式中的操作,對外部沒啥用.因為外部沒有實體,你影響不了.

你影響的也是你引數新搞的實體.

in=常 域,不能修改,無外部引用.

out,按引用返回值.元組/陣列可以替代他們.

保證在函式中不變.不變一直不變.可變變數也可通過傳遞.只是可變在該函式不變.

ref按引用傳值.

有些函式式程式設計,不允許按引用修改外部.從返回值中變化.易於(實現,理解,維護).

auto ref,模組與引用結合.這個按引用取左值,按複製取右值.

inoutconst,immutable,mutable的萬用字元.

import std.stdio;

int[

]inner

(int

slice)

}return slice;

}void

main()

擴充套件為常/不變/變,最後統稱為進出,即怎麼進來的就怎麼出去.

lazy,引數中的,為了省略計算可能的未用引數.

即,這個時候引數還沒用,但已經返回了.沒必要計算了.

,不在函式區間外使用.結合dip1000才能用.dip:d的改進措施,目前還在實驗.

int

globalslice;

@safe int

foo(scope int

parameter)

void

main()

域表示作用域僅限於當前函式.出了作用域,沒有對其的引用.

int

globalslice;

@safe int

foo(scope int

parameter)

void

main()

共享要求引數可在多個執行緒中共享.

void

foo(shared int

i)void

main()

引數中的return,代表本引數的生命期比返回的生命期大.即不會失效.return ref連著用.

return ref==return scope.這種引用也叫密封引用.

const不變都是可傳遞的.

scope保證不會洩露引數的引用.

05用d程式設計切片

切片,動態陣列的別名.起.尾 是這樣的 即左包右不包 切片不是實體,就像鑰匙一樣.如果切片修改實體,則實體也跟著變了.a.a 大小為0,a.表示陣列長度,等價於陣列.長度.dup複製實體.如下 import std.stdio void main 賦值 int 3 a 1 1,1 int 3 b 2...

06用d程式設計 串

最簡單定義 char是串,字元陣列 d有三種陣列型別.import std.stdio void main 用 c z 可以看到結果,否則 回車 沒用.readf不適合讀串,讀符就差不多了.readln適合讀串,就不需要 s及 運算子了.如下 import std.stdio void main 可...

08用d程式設計域

不能在內部域中定義與外部域中相同的名字.有的在域的最前定義變數 一般在使用前定義變數,而不是在之後.找不到,也不規範 最好在剛要使用前定義,在速度,不犯錯,可讀,維護上都不錯.import std.stdio void main i 10 i 在 中宣告多種型別變數 d官方程式設計風格 三元符.三個...