Ruby - 按引用或按值的参数? [复制]

Posted

技术标签:

【中文标题】Ruby - 按引用或按值的参数? [复制]【英文标题】:Ruby - Parameters by reference or by value? [duplicate] 【发布时间】:2014-05-14 16:29:54 【问题描述】:

我不明白为什么他们sayRuby 按值传递所有参数,同时下面的代码证明相反:

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

【问题讨论】:

除了整个“@var1”是一个类变量,当你在实例之外访问它时”事情(你认为 123 与任何事情有什么关系),以及“wat”因为什么你说的没有道理。 @DaveNewton,我没听懂。 您将其设置为新值。为什么你认为它不会改变? Ruby 通过引用传递一切,它没有按值传递的概念。您从哪里听说它按值传递参数? @TerranceKennedy:那是倒退。 Ruby 完全是按值传递,没有按引用传递的概念。答案中的冗长解释。 【参考方案1】:

这个问题让人很困惑,因为有一个东西叫做引用类型,还有一个东西叫做 pass-by-reference,但它们实际上并没有太大的关系。

引用和值以及作为引用的值:A(分类)简要概述

在传递引​​用的情况下,函数的参数是对传递给函数的变量的引用,修改参数会修改原始变量。 这不是 Ruby。 例如,让我们看看下面的代码:

def inc(val)
  val += 1
end

a = 1
inc a
puts a

如果 Ruby 是一种按引用传递的语言,该程序将打印 2,因为 inc 中的 val += 1 会增加 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." 将完全用字符串 "What? I didn't say anything." 替换 be_nice_to_me 的值但实际上 @ 987654333@ 的罪孽暴露无遗。如果 Ruby 不通过引用传递,这怎么可能?

好吧,还记得我之前提到的那些引用类型吗?嗯,这就是 Ruby 中的对象。引用类型是其值是对其他事物的引用的类型。在这种情况下,变量的值是对字符串"hello" 的引用。当您传递字符串时,变量的值(即引用)被复制到变量str 中。所以现在它们都持有对同一个对象的引用,但str 不是对be_nice_to_me 的引用。因此,当您修改对象时,这些更改会显示出来,因为它们都指的是同一个对象。但是当您修改一个变量时,另一个变量看不到它,因为两个变量都不是对另一个变量的引用

Ruby 是按引用传递还是按值传递?它是按值传递的,但所有的值都是引用。

【讨论】:

有人必须说,所以我会这样做:1 是一个对象(但不可变)。但是,是的,术语是一团糟。 @muistooshort 同意 100%。有趣的是,Chuck 在这里用来展示 Ruby 的同一个例子是(他的定义)按值传递,我会用它来证明 Ruby 是(我的定义)按引用传递。我将避免在未来对 Ruby 中的按值/引用传递进行笼统的陈述,这似乎会让人们更加困惑。 @TerranceKennedy:是的,我完全明白你为什么这么称呼它。您对“按引用传递”的定义与人们在现实世界中编程的方式更相关。但不幸的是,我们被半个世纪以来的计算机科学文献和仍然使用旧定义的整个教育系统所困,所以我认为让人们知道“如果你读到‘通过引用’这个词,它是很重要的。可能不是在谈论 Ruby。” C# 具有引用和值类型,以及按值传递和按引用传递语义。如果您尝试这四种组合,您可以很容易地看到这些概念是完全正交的:***.com/a/12438174/2988 所以基本上,引用类型指针,对吧?

以上是关于Ruby - 按引用或按值的参数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

我应该在哪里更喜欢按引用传递或按值传递?

R按值传递或按引用传递[重复]

按值传递或按引用传递

第7章 按值传递或按引用传递:7.6 推荐的模板参数声明方法

Ruby 是按值传递还是按引用传递? [复制]

按引用传递或按值传递指针容器之间的区别