Merhaba,
Henüz inout
'u olaylarını (buna, in
ve out
da eklenebilir) tam anlamamışken bir süredir şu alışık olduğumuz return
'den farklı bir şeyler dönüp dolaşıyor, örneğin şu güncel başlık:
https://forum.dlang.org/thread/vvchetayjctvsrktjrrp@forum.dlang.org
Bunu denemek için soru/cevaplarda yazılanları şurada (online editor ile çalıştırılacak şekilde) derledim ve çıkan sonuç da şöyle:
onlineapp.Foo: 42
onlineapp.Bar: 41
eşitler
core.exception.AssertError@onlineapp.d(40): değiller
----------------
??:? _d_assert_msg [0x557ffe7c4378]
./onlineapp.d:40 pure nothrow @nogc @safe immutable(char)[] onlineapp.main().eşitler_mi() [0x557ffe7a32d8]
./onlineapp.d:50 _Dmain [0x557ffe7a3279]
Aslında, çıkan hata da dahil her şey istendiği gibi çalışıyor: Yani biri referans nesnesi olan Foo & Bar, ikişerli şekilde yarı otomatik ve init & setX ikilisi ile ilginç ve tuhaf şekilde kuruluyor...
Elbette başlığı açana sormak lazım; neden bu şekilde bir şey yapmış ama foo & bar ile fun & gun kopyalarının sahip olduğu üye (int x
) istediğimiz değerleri alıyor. Meşhur set eden işlevimiz şu:
int* setX(T)(return auto ref T t)
{
static if(is(T == class))
{
return &t.x;
}
else static if(is(T == struct) && __traits(isRef, t))
{
return &t.x;
}
else
{
static assert(0, "no impl " ~ T.stringof);
}
}
Yaptığı şey basit çünkü soruyu soran, yapı ve sınıf için ayrı ayrı yardımcı işlev tanımlamadan statik yapıyla bir taşla 2 kuş vurmak istiyor. Gelen cevaba bakılırsa, hiçbir derleme hatası olmayacak şekilde bunu başaran bir işlevimiz var. Acaba bu şekilde x'i değiştirmenin ne faydası var ve return ref
şart mı? Gerçi bu konuyu anlamak için şuradaki örnekler daha mantıklı görünüyor:
https://dlang.org/spec/function.html#return-ref-parameters
Teşekkürler...