【发布时间】:2011-05-22 13:25:12
【问题描述】:
参数传递技巧:
根据我对这两种技术的了解。
通过引用调用:
变量的地址位置被传递到函数中,因此在函数的局部范围内,对局部变量值的任何更改都会改变原始变量的值,因为它们指向同一个地点。
按姓名呼叫:
实际变量被传递到函数中。函数局部范围内对变量值的任何更改也将反映在函数外部。
在我看来,这两种参数传递技术完成了同样的事情?它们都作用于原始变量内容。我的定义有错吗?我是否以错误的方式思考这个问题?
【问题讨论】:
参数传递技巧:
根据我对这两种技术的了解。
通过引用调用:
变量的地址位置被传递到函数中,因此在函数的局部范围内,对局部变量值的任何更改都会改变原始变量的值,因为它们指向同一个地点。
按姓名呼叫:
实际变量被传递到函数中。函数局部范围内对变量值的任何更改也将反映在函数外部。
在我看来,这两种参数传递技术完成了同样的事情?它们都作用于原始变量内容。我的定义有错吗?我是否以错误的方式思考这个问题?
【问题讨论】:
按名称调用与您描述的略有不同。在伪代码中,想象一下:
function foo(index, value-increment)
sum = 0
loop index = 1 to 3
sum = sum + value-increment
return sum
x = 3
foo(x, 1 / x)
如果我们的foo 调用是通过引用进行的,则第二个参数1 / x 只被评估一次,有效地给我们:1/3 + 1/3 + 1/3。这是一个严格的评估 - 在应用函数之前,每个参数都经过全面评估。
如果我们按名称调用,1 / x 不会被严格评估。相反,它会根据需要在循环中进行评估。实际上,循环变为:
loop x = 1 to 3
sum = sum + 1 / x
或 1/1 + 1/2 + 1/3。
看看thunks,虽然thunk 并不总是意味着按名称调用。 Haskell 有 thunk 的想法,但使用 call-by-need,其中 1 / x 在需要之前不会被评估,但只会被评估一次(更不用说 Haskell 没有可变循环变量)。
其他资源:
【讨论】: