参数传递技术:
从我可以收集到的这两种技术。
按参考呼叫:
变量的地址位置正在传递给函数,因此在函数的局部范围内,对局部变量值的任何更改都将改变原始变量的值,因为它们指向同一个变量的值。的地方。
按姓名呼叫:
实际变量正在传递给函数。函数局部范围内变量值的任何更改也将反映在函数的外部。
在我看来,这两种参数传递技术完成了同样的事情吗?它们都作用于原始变量内容。我的定义有错吗?我是以错误的方式思考这个问题吗?
答案 0 :(得分:16)
按名称呼叫与您描述的略有不同。在伪代码中,想象一下:
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没有可变的循环变量)。
其他资源: