我刚刚进入Ruby并且来自Java和C / C ++环境。
在编写Ruby中的第一个小项目时,我不知何故习惯了让所有局部变量以下划线开头。我想我的主要动机是更好的可读性和方法调用的区别。
原则上只有三种类型的变量($global
,@instance
和local
),绝大多数变量都以下划线开头。我不确定,这是好还是坏。此外,在很多其他语言中,下划线将被替换为其他一些字符。
在通常的 CamelCase 和/或下划线旁边,是否存在关于变量命名的最佳实践?专业“红宝石”的习惯是什么?当我选择领先的下划线时,我是否忽略了一些常规的Ruby约定?
修改
感谢所有的答案和建议。它对我帮助很大。
以下答案和评论的简短摘要
(适用于短时间访问者)
领先的下划线与:
def my_method(_my_arg)
my_array.each { |_x| puts _x}
所有其他局部变量没有前导下划线,因为程序员来自例如JavaScript might get confused关于变量的预期行为。
为了在变量名和方法调用之间进行直观分离,强制自己使用“(
”括号“)
”和所有方法调用可能会显着提高可读性。
答案 0 :(得分:6)
这个问题的现有答案现在已经有几年了,而且惯例也发生了变化。您应该只使用前导下划线(_some_param
)或独立下划线(_
)来表示您不关心该值。 rubocop样式linting工具如果你分配了一个变量但是没有使用它,那么就会关注“无用的赋值”,但它会忽略带有前导下划线的变量。这允许您明确指出您不关心该值并且不打算使用它。
这是RSpec上下文中一个有点人为的示例用例:
describe 'login' do
let(:user) { FactoryGirl.create(:user, login: 'bob') }
it 'must be unique' do
_user1 = user
user2 = User.new login: 'bob'
expect(user2.valid?).to be_false
end
end
这里我们指出我们的user
帮助器有副作用并返回一些东西,但我们并不关心它。你也可以完全跳过作业,但在一行上看到一个裸user
看起来很奇怪,并没有清楚地表明这个意图:
describe 'login' do
let(:user) { FactoryGirl.create(:user, login: 'bob') }
it 'must be unique' do
user
user2 = User.new login: 'bob'
expect(user2.valid?).to be_false
end
end
其他方案包括忽略迭代器中的值,或者覆盖要保留原始方法签名但不关心某些值的方法:
def greet(name, _title)
puts "Hi, #{name}!"
end
答案 1 :(得分:3)
根据我的经验,Ruby中的下划线前缀变量很像JavaScript中的下划线前缀变量:“不要触摸”标志。更具体地说,当实现者正在做一些实际上不应被理解为对象的一部分的东西时,或者不应该将它们视为对象的概念界面时使用它们。
这在JavaScript世界中更为明显,有些人通过在变量前加下划线来模仿“私有”。它们编码的是对象的一部分在幕后,当从外面看对象时可以忽略它。
在Ruby中,我只是通过缓存或单例实例看到了这一点 - 对象的使用者应该看不到的东西。非下划线变量是使用您的对象的人可能有兴趣知道的事情。
无论如何,它们看起来相当罕见,我会避免它们,除非你想向下一个发出信号的人发出信号,那就是发生了一些额外的魔法或伏都教。
就区分方法调用而言,如果您担心方法和局部变量之间可能存在混淆,我会调用self
上的方法来澄清。例如:
def foo
...
end
def some_method
foo # method
bar # variable
end
如果出于某种原因这似乎不清楚,你可以用
澄清def some_method
self.foo
bar
end
答案 2 :(得分:2)
你的想法没有错。但是,如果我在区分本地变量和方法调用时遇到问题,我可能会强迫自己总是在方法上使用()
。 (我的工作团队已经讨论过制定这部分编码标准)。
a = thing # var
b = thing() # method
这可能带来的好处是对他人的可读性。有人可能想知道你的领先_,但在所有方法调用中使用()
应该对每个人都清楚。
答案 3 :(得分:1)
看到实例变量如何在它们前面有@
符号,并且全局变量在ruby中已经有$
符号,可能没有必要在下面添加下划线字符前面的变量名称。话虽如此,我认为这不一定是一种坏习惯。如果它可以帮助您在Ruby中读取或编写代码,那么您应该使用它。
我有时会看到Ruby代码,其中类的实例方法的参数在其前面有一个下划线。如:
def my_method(_argument1)
# do something
end
我认为当你处理一个可能拥有它自己属性的类时,例如rails中的模型文件,这可能会有所帮助,这样你就知道你正在处理一个已传入的变量该方法与属于类/模型的属性之一相对。