【发布时间】:2014-10-24 00:51:27
【问题描述】:
当你在 Rails 中看到方法或变量前面带有下划线时,在 Ruby 中是什么意思
submit_tag _('Enroll')
:notice => _('Update card.')
或
_session_id
这些只是约定,还是暗示变量/方法的行为存在功能差异?
【问题讨论】:
标签: ruby-on-rails ruby syntax naming-conventions
当你在 Rails 中看到方法或变量前面带有下划线时,在 Ruby 中是什么意思
submit_tag _('Enroll')
:notice => _('Update card.')
或
_session_id
这些只是约定,还是暗示变量/方法的行为存在功能差异?
【问题讨论】:
标签: ruby-on-rails ruby syntax naming-conventions
在行为上没有区别。这只是转换。
但是让我们仔细看看:
_('A string') 实际上是一个方法而不是一个变量。下划线方法由 Gettext 定义并翻译一个字符串。
@_foo 常用于向其他开发人员表明该变量有一些特殊之处,因此不应使用它。对于用于缓存值的变量,我经常看到这种模式,例如:
def expensive_operation
@_expensive_operation ||= begin
# long running code...
end
end
而下划线有时用于表示块中没有使用变量。像这样:
a_hash.each do |_, value|
# do something with the value, not with the key
end
【讨论】:
|_not_using_the_key_here, value|,虽然我不记得在 SO... 看到过那种形式...
这两种情况完全不同。
第二个看起来像是一个局部变量(虽然它可能是一个方法调用,但没有上下文是无法分辨的)。以下划线开头的局部变量在未使用时不会生成“未使用变量”警告,这就是为什么它们用于指示有意未使用的变量(与错字或编程错误)。
第一个是对名为_ 的方法的调用。这个方法的作用,取决于那个时候self的类,你必须查看那个类的文档。
在 IRb 中,_ 是一种返回最后一个被计算的表达式的结果的方法。
【讨论】: