将对象作为参数传递时,是否通过引用传递?

时间:2011-06-29 20:44:46

标签: ruby-on-rails ruby pass-by-reference

如果我执行其中任何一项,是否会产生性能影响:

def do_something(user, article)
...
end

def do_something(user_id, article_id)
  ..
end

我更喜欢传递物体,因为我可能需要其他属性。

5 个答案:

答案 0 :(得分:16)

两种方法调用都需要大约相同的时间。

(了解性能后果是很好的,你提出了一个合理的问题,但即便如此,关于早期优化的标准免责声明 1 在技术上也适用。)


1。 首先,让程序工作。 然后,个人资料。 最后,也许,优化。
Donald Knuth said: 我们应该忘记小事 效率,约占97% 时间:过早优化是 万恶之源。 功能

答案 1 :(得分:4)

回复:https://stackoverflow.com/a/6528257(我在撰写本文时没有足够的声誉发表评论)

啊,但Jörg,如果您实际上操纵参数,而不是为其分配新对象,则该方法的行为会有所不同。使用.replace代替=可以获得以下结果:

def is_Ruby_pass_by_value_or_reference?(parameter)
  parameter.replace 'Ruby is pass-by-reference.'
end

var = 'Ruby is pass-by-value.'

is_Ruby_pass_by_value_or_reference?(var)

puts var
# Ruby is pass-by-reference.

事实上,让我们再详细说明一下,只是为了显示差异:

def is_Ruby_pass_by_value_or_reference?(parameter)
  parameter.replace 'Ruby is pass-by-reference.'
  parameter = "This assigns a whole new object to 'parameter', but not to 'var'."
  puts parameter
end

var = 'Ruby is pass-by-value.'

is_Ruby_pass_by_value_or_reference?(var)
# This assigns a whole new object to 'parameter', but not to 'var'.

puts var
# Ruby is pass-by-reference.

答案 2 :(得分:1)

不,Ruby 从不通过引用传递。 Ruby是按值传递的。总是。没有例外。

def is_Ruby_pass_by_value_or_reference?(parameter)
  parameter = 'Ruby is pass-by-reference.'
end

var = 'Ruby is pass-by-value. Always. No exceptions.'

is_Ruby_pass_by_value_or_reference?(var)

puts var
# Ruby is pass-by-value. Always. No exceptions.

如果Ruby 传递引用,则会打印Ruby is pass-by-reference.

答案 3 :(得分:0)

例如,我会使用_id变体。我更喜欢始终能够获得正确的对象状态。与陈旧的人一起工作永远不会有趣。

答案 4 :(得分:-3)

好吧,一切都是ruby中的Object(一切都继承自Object),ruby总是通过ref传递对象,所以你的两个例子都是通过引用传递的!