我基本上是一名java开发人员。我在红宝石工作了大约一年。与java不同,Ruby是一种纯粹的面向对象的编程语言。这里就有一个疑问了。是按值传递还是按引用传递? Java 以值传递的方式工作:“当传递基元时,我看到值被复制并传递给方法。但是在对象的情况下,引用被复制并传递给方法。引用包含对象的位置在堆中。在方法调用期间,仅传递对象的位置。因此不会创建重复的对象。相同的对象被修改。”
但是当我尝试下面的 ruby 代码片段时,我得到了与 Java 中相同的结果:“在方法调用期间,数字像基元一样工作(就像在 java 中一样),而数组则像在 java 中一样完美引用”。现在,我很困惑。如果 ruby 中的一切都是对象,那么为什么在方法调用期间数字对象会重复?
class A
def meth1(a)
a = a+5
puts "a inside meth1---#{a}"
end
def meth2(array)
array.pop
puts "array inside meth2---#{array}"
end
end
obj1 = A.new
aa=5
obj1.meth1(aa)
puts "aa-----#{aa}"
arr = [3,4,5]
obj1.meth2(arr)
puts "arr---#{arr}"
Results:
a 内部 meth1---10
aa-----5
meth2 内的数组---34
arr---34
Ruby 使用按值传递,或者更准确地说,按值传递的一种特殊情况,其中传递的值是always一个指针。这种特殊情况有时也称为按共享调用、按对象共享调用或按对象调用。
Java(用于对象)、C#(默认用于引用类型)、Smalltalk、Python、ECMAScript/JavaScript 以及或多或少创建的所有面向对象语言都使用相同的约定。
注意:在所有现有的 Ruby 实现上Symbol
s, Fixnum
s and Float
s实际上已经通过了directly按价值和not带有中间指针。但是,由于这三个是不可变的,因此在这种情况下,按值传递和按对象共享调用之间没有可观察到的行为差异,因此您可以通过简单地处理来极大地简化您的心理模型一切作为按对象共享调用。只需将这三种特殊情况解释为您无需担心的内部编译器优化。
下面是一个简单的示例,您可以运行它来确定 Ruby(或任何其他语言,翻译后)的参数传递约定:
def is_ruby_pass_by_value?(foo)
foo.replace('More precisely, it is call-by-object-sharing!')
foo = 'No, Ruby is pass-by-reference.'
return nil
end
bar = 'Yes, of course, Ruby *is* pass-by-value!'
is_ruby_pass_by_value?(bar)
p bar
# 'More precisely, it is call-by-object-sharing!'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)