引數,始終複製引數,除非加了ref
(c++的&).
即使是引用型別(切片,關聯陣列,類)也是複製的,當然,複製的是鑰匙.實體未複製.因此,通過它是可以直接修改原實體的.因為鑰匙的能力是很強的.
當然通過值傳遞,因為複製的都是鑰匙.
但切片,不僅僅是鑰匙,一但增加超過容量.鑰匙變實體,這個時候,原來的實體就不會變.
所以,對於切片,要加引用
才能只用原來的引用
.
同樣:關聯陣列,初化時是個無效
針.同樣,將關聯陣列按ref
傳遞好,不然,什麼時候
鑰匙變實體,你也搞不清楚.
d語言
切片比較複雜
.
無效
意味著未初化(乙個空指標).當新增第乙個時,才建立實體
.因而:
import std.stdio;
void
(int
[string] aa)
void
main()
即除了鑰匙變實體
外,還有空針變實體
,就是為了點懶
初化.說實話,懶初化
有的時候,沒多大意義,節約不了啥.
因而,關聯陣列,類,切片
最好都按引用
傳遞引數.
值型別都是複製的.雖然可能複製的都是鑰匙.或者可能複製的是空針
.
引用型別有的複製的是鑰匙
,所以,你看見的仍然在原有實體上操作.
有的複製的是空針
,這時,還沒有建立起實體,你在函式中的操作,對外部沒啥用.因為外部沒有實體,你影響不了.
你影響的也是你引數
新搞的實體.
in
=常 域
,不能修改,無外部引用.
out
,按引用
返回值.元組/陣列
可以替代他們.
常
保證在函式中
不變.不變
一直不變.可變變數
也可通過常
傳遞.只是可變
在該函式
中不變
.
ref
按引用傳值.
有些函式式程式設計,不允許按引用
修改外部.只
從返回值中變化.易於(實現,理解,維護).
auto ref
,模組與引用結合.這個按引用
取左值,按複製
取右值.
inout
是const,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官方程式設計風格 三元符.三個...