Tor*_*örn 9 ruby naming-conventions
我刚刚进入Ruby并且来自Java和C/C++环境.
在编写Ruby中的第一个小项目时,我不知何故习惯了让所有局部变量以下划线开头.我想我的主要动机是更好的可读性和方法调用的区别.
原则上只有三种类型的变量($global,@instance和local),绝大多数变量都以下划线开头.我不确定,这是好还是坏.此外,在很多其他语言中,下划线将被替换为其他一些字符.
有没有关于变量命名的最佳实践,除了通常的CamelCase和/或下划线分开?专业"红宝石"的习惯是什么?当我选择领先的下划线时,我是否忽略了一些常规的Ruby惯例?
编辑
感谢所有的答案和建议.这对我帮助很大.
以下答案和评论的简短摘要
(适用于短期访客)
领先的下划线与:
def my_method(_my_arg)my_array.each { |_x| puts _x}所有其他局部变量没有前导下划线,因为来自JavaScript的程序员可能会对变量的预期行为感到困惑.
对于变量名和方法调用之间的视觉分离,强制自己在所有方法调用中使用" ("括号" )" 可能会显着提高可读性.
这个问题的现有答案现在已经有几年了,而且惯例也发生了变化.您应该只使用前导下划线(_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
Run Code Online (Sandbox Code Playgroud)
在这里,我们指出我们的usermemoization助手有副作用并返回一些东西,但我们并不关心它.你也可以完全跳过这个任务,但看到一条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
Run Code Online (Sandbox Code Playgroud)
其他方案包括忽略迭代器中的值,或者覆盖要保留原始方法签名但不关心某些值的方法:
def greet(name, _title)
puts "Hi, #{name}!"
end
Run Code Online (Sandbox Code Playgroud)
你的想法没有什么问题。但是,如果我无法区分本地变量和方法调用,我可能会强迫自己始终()在方法上使用 's 。(我的工作团队已经讨论过将这部分纳入我们的编码标准)。
a = thing # var
b = thing() # method
Run Code Online (Sandbox Code Playgroud)
这样做的可能优点是对其他人的可读性。有人可能会对你的前导 _ 感到好奇,但是()在所有方法调用上使用 ' 应该是每个人都清楚的。