void foo(int&x) – > Ruby? 通过引用传递整数?
作为一种为我的C ++编程作业增添趣味的一种方式,我决定不再将书中的C ++输入到我的计算机上,而是在Ruby中对其进行改造。 是的,它有点傻,但我很无聊。
无论如何,我在将这种function转换为Ruby时遇到了麻烦
void swap(int &a,int &b){ int c=b; b=a; a=c }
函数中等效的ruby代码是什么?
Ruby是严格按值传递的。 总是。 但有时候这些价值观就是那些价值观。
这里有几个链接:
- 该死是价值传递! (Scott“JavaDude”Stanchfield)
- Java中的参数传递(Jon Skeet)
- Java是通过引用传递的吗?
- Java,传值,引用变量
请注意,虽然所有这些都说“Java”,但他们应该说“Smalltalk及其后代”,其中包括Java,Ruby和许多其他语言。
我认为大多数混乱源于两个问题:
- Ruby按值传递引用。 但该句中的“引用”一词与“引用转移”中的“引用”一词并不相同。 当我们消除歧义时,可能更清楚:让我们将“传递参考”替换为“传递变量”和“参考”替换为“指针”(注意这些是“好的”表现良好的指针,而不是“坏” “来自C的人):
- Fortran是按变量传递的
- Ruby是按值传递的,它传递的值主要是poointers
- Ruby传递的引用(poointers)指向可变对象。 因此,虽然您无法更改引用,但可以改变引用指向的对象。 这里的问题是Ruby(像大多数命令式面向对象语言一样)混淆了身份,状态和价值的概念。 您可以在此处了解有关该问题以及如何解决该问题的更多信息(请注意,虽然他们说“Clojure”,但所呈现的概念是通用的,并且可以同样适用于OO):
- 持久性数据结构和托管参考 – Clojure的身份和状态方法 – 丰富的Hickey – QCon London 2009
- 我们到了吗? – 解构面向对象的时间 – Rich Hickey – JVM语言峰会
顺便说一句:我故意用面向对象的OO拼错“poointers”,以明确我不是在谈论原始内存地址,我说的是对对象的不透明引用(并且出于显而易见的原因,我不想使用这个词“参考”;如果你知道一个更好的词既不是“指针”也不是“参考”,我很乐意听到它。
在Ruby中,参数按值传递。 所以以下方法永远不会有任何影响:
def doesnt_swap(a, b) c = a a = b b = c end
另一方面,大多数对象都是引用,例如字符串,所以你可以写
def swap_strings(a, b) c = a.dup a.replace(b) b.replace(c) end
这将交换两个参数的字符串值。
整数是直接的,所以没有相当于replace
; 你不能写swap_integers
。
无论如何,在Ruby中,你通过写a, b = b, a
交换