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

如果我执行以下任一操作,是否会影响性能:

def do_something(user, article) ... end 

 def do_something(user_id, article_id) .. end 

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

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

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


1.首先,让程序工作。 然后,个人资料。 最后,也许,优化。
唐纳德克努特说: 我们应该忘记小的效率,大约97%的时间说:过早的优化是所有邪恶的根源。

回复: 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. 

不,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 pass-by-reference,那么打印Ruby is pass-by-reference.

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

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