用英語命名標識符。
# bad - identifier using non-ascii characters
заплата = 1_000
# bad - identifier is a Bulgarian word, written with Latin letters (instead of Cyrillic)
zaplata = 1_000
# good
salary = 1_000
使用snake_case的形式給變量和方法命名。
# bad
:'some symbol'
:SomeSymbol
:someSymbol
someVar = 5
def someMethod
...
end
def SomeMethod
...
end
# good
:some_symbol
def some_method
...
end
Snake case: punctuation is removed and spaces are replaced by single underscores. Normally the letters share the same case (either UPPER_CASE_EMBEDDED_UNDERSCORE or lower_case_embedded_underscore) but the case can be mixed
使用CamelCase(駝峰式大小寫)的形式給類和模塊命名。(保持使用縮略首字母大寫的方式如HTTP,
RFC, XML)
# bad
class Someclass
...
end
class Some_Class
...
end
class SomeXml
...
end
# good
class SomeClass
...
end
class SomeXML
...
end
使用 snake_case 來命名文件, 例如 hello_world.rb。
以每個源文件中僅僅有單個 class/module 為目的。按照 class/module 來命名文件名,但是替換 CamelCase 為 snake_case。
使用SCREAMING_SNAKE_CASE給常量命名。
# bad
SomeConst = 5
# good
SOME_CONST = 5
在表示判斷的方法名(方法返回真或者假)的末尾添加一個問號(如Array#empty?)。
方法不返回一個布爾值,不應該以問號結尾。
可能會造成潛在“危險”的方法名(如修改 self或者 參數的方法,exit! (不是像 exit 執行完成項)等)應該在末尾添加一個感嘆號如果這里存在一個該 危險 方法的安全版本。
# bad - there is not matching 'safe' method
class Person
def update!
end
end
# good
class Person
def update
end
end
# good
class Person
def update!
end
def update
end
end
如果可能的話,根據危險方法(bang)來定義對應的安全方法(non-bang)。
class Array
def flatten_once!
res = []
each do |e|
[*e].each { |f| res f }
end
replace(res)
end
def flatten_once
dup.flatten_once!
end
end
當在短的塊中使用 reduce 時,命名參數 |a, e| (accumulator, element)。
#Combines all elements of enum枚舉 by applying a binary operation, specified by a block or a symbol that names a method or operator.
# Sum some numbers
(5..10).reduce(:+) #=> 45#reduce
# Same using a block and inject
(5..10).inject {|sum, n| sum + n } #=> 45 #inject注入
# Multiply some numbers
(5..10).reduce(1, :*) #=> 151200
# Same using a block
(5..10).inject(1) {|product, n| product * n } #=> 151200
在定義二元操作符時,把參數命名為 other ( 與 [] 是這條規則的例外,因為它們的語義不同)。
def +(other)
# body omitted
end
map 優先于 collect,find 優先于 detect,select 優先于 find_all,reduce 優先于inject,size 優先于 length。以上的規則并不絕定,如果使用后者能提高代碼的可讀性,那么盡管使用它們。有押韻的方法名(如 collect,detect,inject)繼承于 SmallTalk 語言,它們在其它語言中并不是很通用。鼓勵使用 select 而不是 find_all 是因為 select 與 reject 一同使用時很不錯,并且它的名字具有很好的自解釋性。
不要使用 count 作為 size 的替代。對于 Enumerable 的 Array 以外的對象將會迭代整個集合來
決定它的尺寸。
# bad
some_hash.count
# good
some_hash.size
傾向使用 flat_map 而不是 map + flatten 的組合。
這并不適用于深度大于 2 的數組,舉個例子,如果 users.first.songs == ['a', ['b', 'c']] ,則使用 map + flatten 的組合,而不是使用 flat_map 。
flat_map 將數組變平坦一個層級,而 flatten 會將整個數組變平坦。
# bad
all_songs = users.map(:songs).flatten.uniq
# good
all_songs = users.flat_map(:songs).uniq
使用 reverse_each 代替 reverse.each。reverse_each 不會分配一個新數組并且這是好事。
# bad
array.reverse.each { ... }
# good
array.reverse_each { ... }
您可能感興趣的文章:- Ruby中編寫類與模塊的風格指南
- Ruby編程中的語法使用風格推薦
- 淺析Ruby的源代碼布局及其編程風格
- 你應該知道的Ruby代碼風格
- GitHub倡導的Ruby代碼編寫風格總結