Swift 中的嵌套函数意外行为?
Nested function unexpected behaviour in Swift?
我正在为嵌套函数尝试以下示例,但出现意外行为:
func chooseStepFunction(value: Int, backward: Bool) -> (Int) -> Int {
print("Current value: \(value)")
func stepForward(input: Int) -> Int {
print("plus from \(input)");
return input + 1
}
func stepBackward(input: Int) -> Int {
print("minus from \(input)");
return input - 1
}
return backward ? stepBackward : stepForward
}
var currentValue = 4
let moveNearerToZero = chooseStepFunction(value: currentValue, backward: currentValue > 0)
// moveNearerToZero now refers to the nested stepForward() function
while currentValue != -2 {
print("\(currentValue)... ")
currentValue = moveNearerToZero(currentValue)
}
我尝试使用向后和向前嵌套函数,但得到以下结果:
Current value: 4
4...
minus from 4
3...
minus from 3
2...
minus from 2
1...
minus from 1
0...
minus from 0
-1...
minus from -1
就像,每次我修改 currentValue
和每次调用 chooseStepFunction
但在控制台中 chooseStepFunction
函数中的 currentValue
只执行一次但是 while 循环中的 currentValue
正在执行 evrytime 那么为什么 chooseStepFunction
会跳过打印值。在我看来,预期结果将是:
Current value: 4
4...
minus from 4
3...
minus from 3
2...
minus from 2
1...
minus from 1
0...
plus from 0
1...
minus from 1
0...
plus from 0
1...
minus from 1
0...
..........
这将是一个无限循环,但为什么它运行良好?
完全没看懂?
这一行:
let moveNearerToZero = chooseStepFunction(value: currentValue, backward: currentValue > 0)
仅运行一次,因为它在循环之外。所以分支 backward ? stepBackward : stepForward
只有一次 运行 。代码选择 stepBackward
一次,再也不会。
let someName = someExpression
并不是说“从现在开始,我每次说someName
,都要评价someExpression
”。它的意思是“计算 someExpression
,并将结果放入名为 someName
的常量中”。
要实现您想要的效果,您可以将 chooseStepFunction
调用移动到循环中:
while currentValue != -2 {
print("\(currentValue)... ")
let moveNearerToZero = chooseStepFunction(value: currentValue, backward: currentValue > 0)
currentValue = moveNearerToZero(currentValue)
}
我正在为嵌套函数尝试以下示例,但出现意外行为:
func chooseStepFunction(value: Int, backward: Bool) -> (Int) -> Int {
print("Current value: \(value)")
func stepForward(input: Int) -> Int {
print("plus from \(input)");
return input + 1
}
func stepBackward(input: Int) -> Int {
print("minus from \(input)");
return input - 1
}
return backward ? stepBackward : stepForward
}
var currentValue = 4
let moveNearerToZero = chooseStepFunction(value: currentValue, backward: currentValue > 0)
// moveNearerToZero now refers to the nested stepForward() function
while currentValue != -2 {
print("\(currentValue)... ")
currentValue = moveNearerToZero(currentValue)
}
我尝试使用向后和向前嵌套函数,但得到以下结果:
Current value: 4
4...
minus from 4
3...
minus from 3
2...
minus from 2
1...
minus from 1
0...
minus from 0
-1...
minus from -1
就像,每次我修改 currentValue
和每次调用 chooseStepFunction
但在控制台中 chooseStepFunction
函数中的 currentValue
只执行一次但是 while 循环中的 currentValue
正在执行 evrytime 那么为什么 chooseStepFunction
会跳过打印值。在我看来,预期结果将是:
Current value: 4
4...
minus from 4
3...
minus from 3
2...
minus from 2
1...
minus from 1
0...
plus from 0
1...
minus from 1
0...
plus from 0
1...
minus from 1
0...
..........
这将是一个无限循环,但为什么它运行良好? 完全没看懂?
这一行:
let moveNearerToZero = chooseStepFunction(value: currentValue, backward: currentValue > 0)
仅运行一次,因为它在循环之外。所以分支 backward ? stepBackward : stepForward
只有一次 运行 。代码选择 stepBackward
一次,再也不会。
let someName = someExpression
并不是说“从现在开始,我每次说someName
,都要评价someExpression
”。它的意思是“计算 someExpression
,并将结果放入名为 someName
的常量中”。
要实现您想要的效果,您可以将 chooseStepFunction
调用移动到循环中:
while currentValue != -2 {
print("\(currentValue)... ")
let moveNearerToZero = chooseStepFunction(value: currentValue, backward: currentValue > 0)
currentValue = moveNearerToZero(currentValue)
}