我不明白为什么他们说 Ruby按值传递所有参数,同时下面的代码证明了相反的情况:
class MyClass1
  @var1 = 123
  def get1
    @var1
  end
  def set1=value
    @var1 = value
  end
end
c1 = MyClass1.new
c1.set1 = 444
p c1.get1 # 444
def test1 mc
  mc.set1 = 999
end
test1 c1
p c1.get1 # 999
如果按价值计算,它会打印出来444,而不是999.
Chu*_*uck 65
这个问题让人困惑,因为有一个叫做引用类型的东西,并且有一个叫做pass-by-reference的东西,但它们实际上并没有那么多关于彼此的事情.
在传递引用方案中,函数的参数是对传递给函数的变量的引用,修改参数会修改原始变量.这不是Ruby的意思.例如,让我们看看以下代码:
def inc(val)
  val += 1
end
a = 1
inc a
puts a
如果Ruby是一个传递引用语言,这个程序将打印2,因为val += 1in inc将增加值a.但事实并非如此.变量val不是对变量的引用a- 它是一个赋予相同值的自变量.
"可是等等!" 你说."如果我们处理对象怎么办?当然,对象变量是通过引用传递的,对吧?"
def change_string(str)
  str << " I can insult you all you want"
  str << " because you'll never see this"
  str << " because I'm going to replace the whole string!"
  str << " Haha you smell bad!"
  str = "What? I didn't say anything." # I'm so sneaky
end
be_nice_to_me = "hello"
change_string(be_nice_to_me)
puts be_nice_to_me
如果Ruby是通过引用传递的,你永远不会看到该change_string方法的意义,因为str = "What, I didn't say anything."它将完全取代be_nice_to_me字符串的值."What? I didn't say anything."但实际上change_string,所有人都看不到它的罪行.如果Ruby没有通过引用传递,这怎么可能?
那么,还记得我之前谈过的那些参考类型吗?嗯,这就是Ruby中的对象.引用类型是一种类型,其值是对其他内容的引用.在这种情况下,变量的值是对字符串的引用"hello".传递字符串时,变量的值(即引用)将复制到变量中str.所以现在他们都持有对同一个对象str的引用,但不是对它的引用be_nice_to_me.因此,当您修改对象时,会显示这些更改,因为它们都指向同一个对象.但是当你修改一个变量时,另一个变量看不到它,因为这两个变量都不是对另一个变量的引用.
Ruby传递引用还是按值传递?它是按值传递,但所有值都是引用.