如果我执行其中任何一项,是否会产生性能影响:
def do_something(user, article)
...
end
与
def do_something(user_id, article_id)
..
end
我更喜欢传递物体,因为我可能需要其他属性。
答案 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传递对象,所以你的两个例子都是通过引用传递的!