以下划线开头的局部变量是不错的做法?

时间:2012-01-23 18:54:28

标签: ruby naming-conventions

我刚刚进入Ruby并且来自Java和C / C ++环境。

在编写Ruby中的第一个小项目时,我不知何故习惯了让所有局部变量以下划线开头。我想我的主要动机是更好的可读性和方法调用的区别。

原则上只有三种类型的变量($global@instancelocal),绝大多数变量都以下划线开头。我不确定,这是好还是坏。此外,在很多其他语言中,下划线将被替换为其他一些字符。

在通常的 CamelCase 和/或下划线旁边,是否存在关于变量命名的最佳实践?专业“红宝石”的习惯是什么?当我选择领先的下划线时,我是否忽略了一些常规的Ruby约定?


修改
感谢所有的答案和建议。它对我帮助很大。


以下答案和评论的简短摘要
(适用于短时间访问者)

领先的下划线与:

  • 方法参数:def my_method(_my_arg)
  • 阻止参数:例如my_array.each { |_x| puts _x}

所有其他局部变量没有前导下划线,因为程序员来自例如JavaScript might get confused关于变量的预期行为。

为了在变量名和方法调用之间进行直观分离,强制自己使用“(”括号“)”和所有方法调用可能会显着提高可读性。

4 个答案:

答案 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中的模型文件,这可能会有所帮助,这样你就知道你正在处理一个已传入的变量该方法与属于类/模型的属性之一相对。