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和许多其他语言。

我认为大多数混乱源于两个问题:

  1. Ruby按值传递引用。 但该句中的“引用”一词与“引用转移”中的“引用”一词并不相同。 当我们消除歧义时,可能更清楚:让我们将“传递参考”替换为“传递变量”和“参考”替换为“指针”(注意这些是“好的”表现良好的指针,而不是“坏” “来自C的人):
    • Fortran是按变量传递的
    • Ruby是按值传递的,它传递的值主要是poointers
  2. 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交换