birkaç
One
D.
nesnelerin üzerinde iterate yapmak yolları
InputRange API uygulamaktır vardır. Giriş aralıkları yineleyicilere benzer, ancak farklı bir API'ye sahip. Arabirim arabirimi uygulamak,
map
,
array
, ve benzeri gibi nesnenizdeki tüm
std.range
/
std.algorithm
işlevlerini kullanabileceğiniz anlamına gelir.
D, rastgele koleksiyonlardan bir iterator almak için __iter__
işlevine sahip değildir, bu nedenle bir giriş aralığı döndüren bir işlevi uygulamanız gerekir.
import std.range;
auto bytes() {
return chain(mime, data, header.serialize);
}
Bu
header.serialize
sonra,
data
bayt ardından
mime
bayt, aşağıdakilerden oluşan, bir
ubyte
giriş aralığı döndürür.
Ayrıca yapı üzerinde opApply
yöntemi uygulayabilir. opApply
yalnızca foreach
ile çalışır, böylece aralık yöntemlerini bununla kullanamazsınız, ancak döngü iş parçacığını yürütmek gibi işleri ayrı iş parçacıklarında yapmanızı sağlar.
opApply
'un özü, D'nin döngü gövdesini bir işlev olarak opApply
'a geçirmesidir; Yani, foreach(x; myObj) { body }
, myObj.opApply((x) { body })
'a dönüştürülür.
void opApply(void delegate(ubyte[] part) loopbody) {
loopbody(mime);
loopbody(data);
loopbody(header.serialize());
}
Ancak bunun yerine bu seçeneklerden birinin, sana bir çıkış aralığı alır ve ona veri yazar senin nesne üzerinde bir işlevi uygulamak öneririz.
Çıkış aralığı, diğer nesneleri kabul eden ve onlara bir şey yapan bir nesnedir. Bu durumda çıkış aralığı, bir çıkış akışına benzer şekilde ubyte
s kabul etmelidir. Bir dizinin dönüştürülebilir bir Appender
içine çıkışını saklar
void serialize(Range)(ref Range outRange) if(isOutputRange!(Range, ubyte)) {
put(outRange, mime); -- `put` simply feeds data into the output range
put(outRange, data);
header.serialize(outRange); // No longer have to allocate/return a ubyte array
}
Örnek kullanım,: anlamına gelir o zaman soket üstünde bir çıkış aralığını uygularsanız
import std.array;
auto serializedDataAppender = appender!ubyte();
myMsg.serialize(serializedDataAppender);
auto serializedData = serializedDataAppender.data;
, çıktı aralığı çözümü , yığından herhangi bir belleği ayırmak zorunda değildir.
Kontrol dışarı Programming in D kitabı (özellikle Aralıkları ve Daha Aralıkları bölümler) Kendi aralıkları nasıl uygulanacağı konusunda bilgi için.
(http://dlang.org/spec/statement.html#ForeachStatement) için birçok yol vardır foreach ifadeleri ile anlaşma. En kolayı belki de giriş aralığıdır, ancak her bir yinelemenin neyi istediğinizi net olarak görmeden, sizin için en iyi yolun hangisi olduğunu söylemek zordur. Daha hassas olabilir misin? – cym13