序列 drop(while:) 看似什么都不做
Sequence drop(while:) Seemingly Does Nothing
drop(while:)
Returns a subsequence by skipping elements while predicate returns true and returning the remaining elements.
通过使用函数签名:
func drop(while predicate: (Self.Element) throws -> Bool) rethrows -> Self.SubSequence
其中 predicate
描述为:
A closure that takes an element of the sequence as its argument and returns a Boolean value indicating whether the element is a match.
我的问题是,根据该描述,不应发生以下行为:
let test = (0...3).drop { [=11=] > 1 }
test.contains(0) // true
test.contains(3) // true
0 不大于 1,因此 drop
立即完成 "dropping",returns 整个序列。
也许您正在寻找 filter(_:)
或 prefix(while:)
我不明白你为什么不理解这种行为。文档非常清楚并且与输出匹配。
文档说当谓词为真时,该方法将继续跳过(丢弃)元素。这就像一个 while 循环:
// not real code, for demonstration purposes only
while predicate(sequence.first) {
sequence.dropFirst()
}
剩下的序列是returned。
对于序列0...3
,基本上是[0, 1, 2, 3]
对吧?
第一个元素 0 是否满足谓词 [=14=] > 1
?不,所以假想的 while 循环中断,没有任何东西被丢弃,所以原始序列是 returned.
我认为您可能将此与 prefix
?
混淆了
使用 prefix
,当谓词为真时,它将继续向序列添加元素,当谓词为假时,return 序列。
let test = (0...3).prefix { [=11=] > 1 }
test.contains(0) // false
test.contains(3) // false
drop(while:)
Returns a subsequence by skipping elements while predicate returns true and returning the remaining elements.
通过使用函数签名:
func drop(while predicate: (Self.Element) throws -> Bool) rethrows -> Self.SubSequence
其中 predicate
描述为:
A closure that takes an element of the sequence as its argument and returns a Boolean value indicating whether the element is a match.
我的问题是,根据该描述,不应发生以下行为:
let test = (0...3).drop { [=11=] > 1 }
test.contains(0) // true
test.contains(3) // true
0 不大于 1,因此 drop
立即完成 "dropping",returns 整个序列。
也许您正在寻找 filter(_:)
或 prefix(while:)
我不明白你为什么不理解这种行为。文档非常清楚并且与输出匹配。
文档说当谓词为真时,该方法将继续跳过(丢弃)元素。这就像一个 while 循环:
// not real code, for demonstration purposes only
while predicate(sequence.first) {
sequence.dropFirst()
}
剩下的序列是returned。
对于序列0...3
,基本上是[0, 1, 2, 3]
对吧?
第一个元素 0 是否满足谓词 [=14=] > 1
?不,所以假想的 while 循环中断,没有任何东西被丢弃,所以原始序列是 returned.
我认为您可能将此与 prefix
?
使用 prefix
,当谓词为真时,它将继续向序列添加元素,当谓词为假时,return 序列。
let test = (0...3).prefix { [=11=] > 1 }
test.contains(0) // false
test.contains(3) // false