我将pass-by-value理解为将对象的副本传递给方法。当编程语言是按值传递时,我们可以更改传递给方法的对象,但它会保留未受影响的原始对象。这是因为副本传递给方法,而不是实际对象本身(或对该对象的引用)。
我理解传递引用意味着传递对实际对象的引用。因此:如果我们将一个对象的引用传递给一个方法:那么当我们修改该方法中的对象时(通过传入的引用),那么实际的对象会在方法范围之外被更改。
示例:
rename_dog(dog)
对我来说:这看起来好像红宝石是通过参考传递的。我们将狗的引用传递给rename_dog(dog)
方法。因为它是一个引用:我们修改实际的 dog对象,它超出了puts
方法的范围,这由最后的puts
语句反映出来。
这与我预期的行为相反,如果ruby是按值传递的话。如果ruby是按值传递:我希望最后"Denver"
语句返回dog.name "New_Dog_Name"
而不是viewWillTransition(to:, with:)
。
我到处看都在网上:到处都说红宝石是按值传递的。我在这里弄错了什么?
答案 0 :(得分:2)
Ruby严格按照价值传递#34;当你考虑变量是什么时。它是指向对象的指针。 Ruby变量和方法参数只能是这些指针。
可能最好通过注释您的示例来显示:
# Define and set local variable 'dog' to a pointer to a new Dog object
dog = Dog.new
puts "Dog's initial name: #{dog.name}" # => Dog's initial name: Denver
# Pass the pointer, *by value* to the rename_dog method
rename_dog(dog)
puts "Dog's New name: #{dog.name}" # => Dog's New name: New_Dog_Name
现在你可能会说"这是一个无用的,技术性的,按值传递的定义"。我会部分同意。这违背了预期。
但是,它只会与指向对象的指针和直接表示这些对象的变量之间有选择的语言相悖。在Ruby中你永远不会有这个选择。 Ruby作为pass-by-value的定义是正确的,但是因为一切都是指针,你必须显式克隆容器对象 - 或者使用返回修改后的副本的方法 - 如果你想在"单独工作值"