将对象作为参数传递时,是否通过引用传递?
如果我执行以下任一操作,是否会影响性能:
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
(一切都从Object
inheritance),ruby总是通过ref传递对象,所以你的两个例子都是通过引用传递的!