On Wednesday, 2 November 2022 at 15:31:44 UTC, Ali Çehreli wrote:
> Böyle akıllılıklar çok zevkli oluyor ama kodu anlamayı güçleştiriyor. Çalışıyorsa özel kodlarda diyecek bir şey yok ama bir "code review"da karşılaşmak istemezdim. :)
Olsun hocam çok şey öğreniyoruz. Hatta her iki işlevin de verileri karışmasın diye 6 elemanlı bir dizi yerine ushort için 4 elemanlı yetiyormuş bile:
auto toHexPair(R)(R str)
{
import core.internal.string;
import std.format, std.range;
string result;
char[4] buffer;
foreach(pair; str.chunks(2))
{
auto slice = buffer[];
slice.put(pair);
ushort n = buffer[0] << 8;
n |= pair.walkLength > 1 ? buffer[1] : 0;
result ~= n.unsignedToTempString!16(buffer)
.format!"%s ";
}
return result;
}
void main()
{
import std.stdio;
auto text = "Dlanguage";
text.toHexPair.writeln;
/* 446c 616e 6775 6167 6500
* fazladan boşluk olunca ^-- bu kaybolcak
*/
}
Dikkatleri, özellikle auto toHexPair(const(char)[] str)
satırına çekmek isterim; bu yeni öğrendiğim bir yöntem. Çünkü önceki gibi string alsaydı karakter temelli başka bir şey alamayacaktı.
Elbette işlev şablonu kullanarak (R)(R str)
şeklinde de yapabilir, iota('a', 'z')
gibi bir aralık da alabilirdi. Ama nedenini bilmediğim bir sebepten, chunks
ya da walkLength
öyle bir aralıkla çalışmıyor ve nihayetinde şöyle kullanmak gerekiyordu:
auto text = iota('a', 'z').array;
toHexPair işlevi, ayrıca artık tek/çift ayrımı yaparak gelen dizgeye ekstra karakter eklemiyor. Basit bir ekleme ile (walkLength sağ olsun!) onu da halletim. Tabi UTF desteklemiyor. O beni şimdilik aşar 😉
Dip Not: Farkında olmadan, geçmişte Steven ile yaptığım tartışmada sunduğum HexStack
ve onun önerdiği toChars()
yerine yukardaki tek işlev çok daha başarılı sonuç verdiğini gördüm. Düşünsenize sadece 1 işlev!
Şimdi projeye takıldığım yerden son sürat devam...