参数传递技巧:Call-By-Name和Call-By-Reference之间的区别
从我可以在这两种技术中收集的内容。
调用由参考:
的变量的地址位置被传递到该函数,从而该函数的局部范围内,局部变量的值的任何变化将改变原始的值变量,因为它们指向相同的地方。
以名称呼叫:
实际变量正在传递到函数中。函数的局部范围内的变量值的任何更改也将反映在该函数的外部。
在我看来,这两个参数传递技术完成同样的事情?它们都对原始变量内容起作用。我有我的定义错误吗?我是否以错误的方式思考这个问题?
参数传递技巧:Call-By-Name和Call-By-Reference之间的区别
从我可以在这两种技术中收集的内容。
调用由参考:
的变量的地址位置被传递到该函数,从而该函数的局部范围内,局部变量的值的任何变化将改变原始的值变量,因为它们指向相同的地方。
以名称呼叫:
实际变量正在传递到函数中。函数的局部范围内的变量值的任何更改也将反映在该函数的外部。
在我看来,这两个参数传递技术完成同样的事情?它们都对原始变量内容起作用。我有我的定义错误吗?我是否以错误的方式思考这个问题?
调用名称与您所描述的略有不同。在伪代码,试想:
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有thunks的想法,但使用call-by-need其中1/x
将不会被评估,直到它需要,但然后将被评估一次(更不用说Haskell不会有一个可变的循环变量)。
其他资源:
这是迄今为止最好的回答这个(类似)的问题,我已经遇到。 – 2017-11-17 20:34:27