使用 :: 引用常量(包括类和模块)和构造器 (比如 Array() 或者 Nokogiri::HTML())。
永远不要使用 :: 来调用方法。
# bad SomeClass::some_method some_object::some_method # good SomeClass.some_method some_object.some_method SomeModule::SomeClass::SOME_CONST SomeModule::SomeClass()</div>
使用括号将def的参数括起来。当方法不接收任何参数的时候忽略括号。
# bad
def some_method()
# body omitted
end
# good
def some_method
# body omitted
end
# bad
def some_method_with_arguments arg1, arg2
# body omitted
end
# good
def some_method_with_arguments(arg1, arg2)
# body omitted
end
</div>
从来不要使用 for, 除非你知道使用它的准确原因。大多数时候迭代器都可以用来替for。for 是由一组 each 实现的 (因此你正间接添加了一级),但是有一个小道道 - for并不包含一个新的 scope (不像 each)并且在它的块中定义的变量在外面也是可以访问的。
arr = [1, 2, 3]
# bad
for elem in arr do
puts elem
end
# note that elem is accessible outside of the for loop
elem #=> 3
# good
arr.each { |elem| puts elem }
# elem is not accessible outside each's block
elem #=> NameError: undefined local variable or method `elem'
</div>
在多行的 if/unless 中坚决不要使用 then。
# bad if some_condition then # body omitted end # good if some_condition # body omitted end</div>
在多行的 if/unless 总是把条件放在与 if/unless 的同一行。
# bad if some_condition do_something do_something_else end # good if some_condition do_something do_something_else end</div>
喜欢三元操作运算(?:)超过if/then/else/end结构。
它更加普遍而且明显的更加简洁。
# bad result = if some_condition then something else something_else end # good result = some_condition ? something : something_else</div>
使用一个表达式在三元操作运算的每一个分支下面只使用一个表达式。也就是说三元操作符不要被嵌套。在这样的情形中宁可使用 if/else。
# bad some_condition ? (nested_condition ? nested_something : nested_something_else) : something_else # good if some_condition nested_condition ? nested_something : nested_something_else else something_else end</div>
不要使用 if x: ... - 它在Ruby 1.9中已经移除。使用三元操作运算代替。
# bad result = if some_condition then something else something_else end # good result = some_condition ? something : something_else</div>
不要使用 if x; ...。使用三元操作运算代替。
利用 if and case 是表达式这样的事实它们返回一个结果。
# bad
if condition
result = x
else
result = y
end
# good
result =
if condition
x
else
y
end
</div>
在 one-line cases 的时候使用 when x then ...。替代的语法when x: xxx已经在Ruby 1.9中移除。
不要使用when x; ...。查看上面的规则。
使用 ! 替代 not.
# 差 - 因为操作符有优先级,需要用括号。 x = (not something) # good x = !something 避免使用 !!. # bad x = 'test' # obscure nil check if !!x # body omitted end x = false # double negation is useless on booleans !!x # => false # good x = 'test' unless x.nil? # body omitted end</div>
The and and or keywords are banned. It's just not worth
it. Always use && and || instead.
and 和 or 这两个关键字被禁止使用了。它名不符实。总是使用 && 和 || 来取代。
# bad # boolean expression if some_condition and some_other_condition do_something end # control flow document.saved? or document.save! # good # boolean expression if some_condition && some_other_condition do_something end # control flow</div>
document.saved? || document.save!
避免多行的 ? :(三元操作符);使用 if/unless 来取代。
单行主体喜欢使用 if/unless 修饰符。另一个好方法是使用 &&/|| 控制流程。
# bad if some_condition do_something end # good do_something if some_condition # another good option some_condition && do_something</div>
布尔表达式使用&&/||, and/or用于控制流程。(经验Rule:如果你必须使用额外的括号(表达逻辑),那么你正在使用错误的的操作符。)
# boolean expression if some_condition && some_other_condition do_something end # control flow document.save? or document.save!</div>
避免多行?:(三元操作运算),使用 if/unless 替代。
在单行语句的时候喜爱使用 if/unless 修饰符。另一个好的选择就是使 and/or 来做流程控制。
# bad if some_condition do_something end # good do_something if some_condition # another good option some_condition and do_something</div>
永远不要使用 unless 和 else 组合。将它们改写成肯定条件。
# bad unless success? puts 'failure' else puts 'success' end # good if success? puts 'success' else puts 'failure' end</div>
不用使用括号包含 if/unless/while 的条件。
# bad if (x > 10) # body omitted end # good if x > 10 # body omitted end</div>
在多行 while/until 中不要使用 while/until condition do 。
# bad while x > 5 do # body omitted end until x > 5 do # body omitted end # good while x > 5 # body omitted end until x > 5 # body omitted end</div>
当你有单行主体时,尽量使用 while/until 修饰符。
# bad while some_condition do_something end # good do_something while some_condition</div>
否定条件判断尽量使用 until 而不是 while 。
# bad do_something while !some_condition # good do_something until some_condition</div>
循环后条件判断使用 Kernel

