Ruby - 参考引用或值?

アレッ*_*ックス 16 ruby

我不明白为什么他们 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
Run Code Online (Sandbox Code Playgroud)

如果按价值计算,它会打印出来444,而不是999.

Chu*_*uck 65

这个问题让人困惑,因为有一个叫做引用类型的东西,并且有一个叫做pass-by-reference的东西,但它们实际上并没有那么多关于彼此的事情.

引用的引用,值和值:A(sorta)简要概述

在传递引用方案中,函数的参数是对传递给函数的变量的引用,修改参数会修改原始变量.这不是Ruby的意思.例如,让我们看看以下代码:

def inc(val)
  val += 1
end

a = 1
inc a
puts a
Run Code Online (Sandbox Code Playgroud)

如果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
Run Code Online (Sandbox Code Playgroud)

如果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传递引用还是按值传递?它是按值传递,但所有值都是引用.

  • 有人必须这样说,所以我会这样做:`1`是一个对象(但是一个不可变的对象).但是,这个术语是一个混乱的混乱. (4认同)
  • @TerranceKennedy:是的,我完全明白你为什么这么称呼它。您对“按引用传递”的定义与人们在现实世界中编程的方式更相关。但不幸的是,我们被困在半个世纪的计算机科学文献和仍然使用旧定义的整个教育系统中,所以我认为让人们知道“如果你读到‘按引用传递’这个术语,它是很重要的”可能不是在谈论 Ruby。” (2认同)