数组前缀(while :) 为相同的逻辑循环不同的次数。 (无法理解)
Array prefix(while:) looping different number of times for same logic. (unable to comprehend)
这是游乐场的镜头,我试图打印所有偶数,直到你以 3 种方式打印出奇数,我不明白为什么它循环的次数不同
根据我的理解,它应该只循环 7 次,因为在开始时有 6 个偶数,而第 7 次有一个奇数必须终止循环,但在一种情况下我们得到了 8 次!为什么?
从字面上看,第二种和第三种方式是相同的,但循环执行的次数仍然存在差异。
这个,没看懂
===== 编辑 =======
我被要求提供代码的文本形式,所以这里是
import UIKit
// First way
var arr = [34, 92, 84, 78, 90, 42, 5, 89, 64, 32, 30].prefix { num in
return num.isMultiple(of: 2)
}
print(arr)
// Second way
var arr2 = [34, 92, 84, 78, 90, 42, 5, 89, 64, 32, 30].prefix(while: {[=10=].isMultiple(of: 2)})
print(arr2)
//Third way (almost second way but directly prinitng this time)
print([34, 92, 84, 78, 90, 42, 5, 89, 64, 32, 30]
.prefix(while: {[=10=].isMultiple(of: 2)}))
我相信这些只是游乐场运作方式的产物。通过稍微重新格式化,我在所有三种变体中都得到了“7 次”:
let data = [34, 92, 84, 78, 90, 42, 5, 89, 64, 32, 30]
let arr = data.prefix {
[=10=].isMultiple(of: 2)
}
print(arr)
let arr2 = data.prefix(while: {
[=10=].isMultiple(of: 2)
})
print(arr2)
print(data.prefix(while: {
[=10=].isMultiple(of: 2)
}))
“(x 次)”的消息并不是说一行在循环中执行了多少次。
这样想,有时候 playground 想在同一行输出多条消息,因为那一行正在评估两个东西。这种情况最常发生在循环中,在每次迭代中都会评估一个新事物,Xcode 想在同一行显示它,但不能,所以只能显示“(2 次)”。
你也可以在其他地方看到这种情况,比如在同一行的闭包:
let x = Optional.some(1).map { [=10=] + 1 }.map { String([=10=]) } // (3 times)
在这里,评估的 3 件事是:
x
[=14=] + 1
String([=15=])
另一个例子:
func f() { print("x");print("y") } // (2 times)
f()
通常,每个 print
语句的右侧都会显示一些文本,不是吗?但由于他们在同一行,Xcode只能显示“(2次)”。
同样的事情发生在这种情况下:
var arr2 = [34, 92, 84, 78, 90, 42, 5, 89, 64, 32, 30].prefix(while: {[=12=].isMultiple(of: 2)})
有8件事要评价。闭包结果求值7次,加上一次arr2
.
的值
如果将变量声明和闭包放在不同的行,那么Xcode 可以将变量的值显示在不同的行,这就是为什么其他两种情况的数字都少了一个。
以图形方式说明:
您正在强制 Xcode 将两条装箱的消息合并为一行。 Xcode 不能有效地将所有文本都放在一行中,所以它能做的最好是“(8 次)”。
这是游乐场的镜头,我试图打印所有偶数,直到你以 3 种方式打印出奇数,我不明白为什么它循环的次数不同
根据我的理解,它应该只循环 7 次,因为在开始时有 6 个偶数,而第 7 次有一个奇数必须终止循环,但在一种情况下我们得到了 8 次!为什么?
从字面上看,第二种和第三种方式是相同的,但循环执行的次数仍然存在差异。
这个,没看懂
===== 编辑 =======
我被要求提供代码的文本形式,所以这里是
import UIKit
// First way
var arr = [34, 92, 84, 78, 90, 42, 5, 89, 64, 32, 30].prefix { num in
return num.isMultiple(of: 2)
}
print(arr)
// Second way
var arr2 = [34, 92, 84, 78, 90, 42, 5, 89, 64, 32, 30].prefix(while: {[=10=].isMultiple(of: 2)})
print(arr2)
//Third way (almost second way but directly prinitng this time)
print([34, 92, 84, 78, 90, 42, 5, 89, 64, 32, 30]
.prefix(while: {[=10=].isMultiple(of: 2)}))
我相信这些只是游乐场运作方式的产物。通过稍微重新格式化,我在所有三种变体中都得到了“7 次”:
let data = [34, 92, 84, 78, 90, 42, 5, 89, 64, 32, 30]
let arr = data.prefix {
[=10=].isMultiple(of: 2)
}
print(arr)
let arr2 = data.prefix(while: {
[=10=].isMultiple(of: 2)
})
print(arr2)
print(data.prefix(while: {
[=10=].isMultiple(of: 2)
}))
“(x 次)”的消息并不是说一行在循环中执行了多少次。
这样想,有时候 playground 想在同一行输出多条消息,因为那一行正在评估两个东西。这种情况最常发生在循环中,在每次迭代中都会评估一个新事物,Xcode 想在同一行显示它,但不能,所以只能显示“(2 次)”。
你也可以在其他地方看到这种情况,比如在同一行的闭包:
let x = Optional.some(1).map { [=10=] + 1 }.map { String([=10=]) } // (3 times)
在这里,评估的 3 件事是:
x
[=14=] + 1
String([=15=])
另一个例子:
func f() { print("x");print("y") } // (2 times)
f()
通常,每个 print
语句的右侧都会显示一些文本,不是吗?但由于他们在同一行,Xcode只能显示“(2次)”。
同样的事情发生在这种情况下:
var arr2 = [34, 92, 84, 78, 90, 42, 5, 89, 64, 32, 30].prefix(while: {[=12=].isMultiple(of: 2)})
有8件事要评价。闭包结果求值7次,加上一次arr2
.
如果将变量声明和闭包放在不同的行,那么Xcode 可以将变量的值显示在不同的行,这就是为什么其他两种情况的数字都少了一个。
以图形方式说明:
您正在强制 Xcode 将两条装箱的消息合并为一行。 Xcode 不能有效地将所有文本都放在一行中,所以它能做的最好是“(8 次)”。