ich kämpfen, um zu verstehen, warum es zwei verschiedene Strukturen in Swift sind die fast gleich sind.SequenceOf und LazySequence - was ist der Unterschied und Gebrauch bestimmt?
- Ist SequenceOf nicht faul?
- Was die Verwendungszwecke für jeden sind?
Edit: Ich denke, ich verstehe immer noch nicht, was "faul" in der Folge bedeutet ... F.E. diesen Code nehmen, die SequenceOf verwendet, das ist angeblich nicht faul:
func myMap<S: SequenceType, V>(source: S,
selector: S.Generator.Element -> V) -> SequenceOf<V> {
let seq = SequenceOf {
_ -> GeneratorOf<V> in
var gen = source.generate()
return GeneratorOf {
let v = gen.next()
println(v)
return v == nil ? nil : selector(v!)
}
}
return seq
}
ist es mit
let a = myMap([1, 2, 3], { $0 * 2 })
var gen = a.generate()
let v1 = gen.next()
let v2 = gen.next()
Optional (1)
Optional (2)
nennen Lassen Sie drucktmir Sieht faul ...
Edit # 2:
Wenn Karte über eine faule Sequenz scheint es trotzdem eifrig Elemente zu evaluieren:
struct TransientView<S: SequenceType> : SequenceType {
private let seq: S
init(_ seq: S) {
self.seq = seq
}
func generate()
-> GeneratorOf<S.Generator.Element> {
var g = seq.generate()
return GeneratorOf {
println("next")
return g.next()
}
}
}
let seq = lazy(map(TransientView([1, 2, 3]), { $0 * 2 }))
druckt "next" 4 mal ...
Edit # 3. Hier ist meine aktuelle Meinung: Es wäre falsch zu sagen "SequenceOf ist nicht faul". Es ist eher "SequenceOf wird mit nicht-faulen .map, .filter, etc erweitert". Es ist durchaus möglich, faule Versionen von Map, Filer usw. zu schreiben, die für jede Sequenz gelten würden, einschließlich SequenceOf. Aber hat Apple entschieden, das „faule“ Paradigma nicht nur auf Fälle von Sequenzen anwenden, sondern Elemente als auch zu sequenzieren - wenn Sie also Sequenzvariable als faul deklarieren, wird LazySequence verwendet und als solche Erweiterungen sind faul. Ich denke, das ist ein falscher Ansatz und eine faule Deklaration sollte nicht auf Elemente übertragen werden - stattdessen sollten Elemente so lange wie möglich faul gehalten werden. Es ist einfach, faul in eifrig zu konvertieren, aber sonst nicht möglich.
Danke, Airspeed Velocity ist mein bester Freund jetzt! –
Können Sie Sequenz Faulheit erklären? - immer noch nicht verstanden ... Aktualisiert die Frage. –
Wenn Sie 'map' auf eine Lazy-Sequenz anwenden, wird ein neuer Generator zurückgegeben, ohne dass alle Werte berechnet werden. Wenn Sie 'map' auf eine nicht-verzögerte Sequenz anwenden, berechnet sie alle Werte sofort und gibt ein Array zurück. –