void foo(int& x) - >红宝石?通过引用传递整数?

时间:2010-04-16 04:35:01

标签: c++ ruby translation pass-by-reference

作为一种为我的C ++编程作业增添趣味的一种方式,我决定不再将书中的C ++输入到我的计算机上,而是用Ruby改进它。是的,这有点傻,但我很无聊。

无论如何,我在将这种功能转换为Ruby时遇到了麻烦

void swap(int &a,int &b){
  int c=b;
  b=a;
  a=c
}

函数中的等效ruby代码是什么?

2 个答案:

答案 0 :(得分:6)

Ruby是严格按值传递的。总是。但有时候这些价值观就是那些价值观。

以下是几个链接:

请注意,虽然所有这些都说“Java”,但他们应该说“Smalltalk及其后代”,其中包括Java,Ruby和其他许多语言。

我认为大多数困惑源于两个问题:

  1. Ruby按值传递引用。但该句中的“引用”一词与“引用引用”中的“引用”一词并不相同。当我们消除歧义时,可能更清楚:让我们将“传递参考”替换为“传递变量”和“参考”替换为“指针”(注意这些是“好的”表现良好的指针,而不是“坏” “来自C的人):
    • Fortran是按变量传递的
    • Ruby是按值传递的,它传递的值主要是poointers
  2. Ruby传递的引用(poointers)指向可变对象。因此,当无法更改引用时,可以改变引用所指向的对象。这里的问题是Ruby(像大多数命令式面向对象语言一样)混淆了身份,状态和价值的概念。您可以在此处了解有关该问题以及如何解决此问题的更多信息(请注意,虽然他们说“Clojure”,但所呈现的概念是通用的,并且可以同样适用于OO):
  3. 顺便说一下:我故意用面向对象的OO拼错“poointers”,以明确我不是在谈论原始内存地址,我说的是对对象的不透明引用(并且出于显而易见的原因,我不想使用“引用”这个词;如果你知道一个更好的词既不是“指针”也不是“引用”,我很乐意听到它。

答案 1 :(得分:1)

在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

进行交换