Ruby 代码规范
对ruby和python这样的动态语言的开发者来说,从来没有官方的编码规范和最佳实践,下面介绍一种。
这个代码的规范推荐ruby开发者把它作为最佳实践,这样一个开发者写的代码就可以被真实世界中的其他开发者维护。
格式
几乎每一个人都相信除了自己的代码别人的风格都是丑陋的,代码都是不可读的。不过事实真的是这样?最好还是有一个规范。
1 source的文件编码使用utf-8。
2 使用2个空格的缩进,不要使用tabs,tabs在不同的操作系统上有不同的空格数(并且可以被人为的设置)。这可能导致在有些人的编辑器在代码看起来不同。
3 在操作符前后使用空格,包括逗号,冒号,分号,{的前后和}的前面,空格也许(大部分)和Ruby的解释器无关,但它的正确使用是写易读的代码的关键。
?
sum = 1 + 2 a, b = 1, 2 1 > 2 ? true : false; puts 'Hi' [1, 2, 3].each { |e| puts e }
?
唯一的例外是使用指数操作符
# bade = M * c ** 2# goode = M * c**2
?
4 没有空格在(, [的后面和], )的前面。
some(arg).other[1, 2, 3].length
?
5 when和case的步长一样深
这个有很多的人不认同,不过这种风格在"The Ruby Programming Language"和"Programming Ruby"都得到了确认。
casewhen song.name == 'Misty' puts 'Not again!'when song.duration > 120 puts 'Too long!'when Time.now.hour > 21 puts "It's too late"else song.playendkind = case year when 1850..1889 then 'Blues' when 1890..1909 then 'Ragtime' when 1910..1929 then 'New Orleans Jazz' when 1930..1939 then 'Swing' when 1940..1950 then 'Bebop' else 'Jazz' end?
6 在一个方法的返回值前面使用空行(除非只有一行),并且在def之间使用空行。
def some_method do_something do_something_else resultenddef some_method resultend?
7 使用api文档和它的约定。不要在注释块和def之间使用空行。
8 使用空行把一个方法分为逻辑段。
9 保持每行少于80个字符
Emacs的用户也许相应设置这样的配置在他们的config中 (e.g. ~/.emacs.d/init.el):
(setq whitespace-line-count 80 whitespace-style '(lines)){code}Vim的用户也许相应设置这样的配置在他们的config中(e.g. ~/.vimrc):{code}" VIM 7.3+ has support for highlighting a specified column.if exists('+colorcolumn') set colorcolumn=80else " Emulate au BufWinEnter * let w:m2=matchadd('ErrorMsg', '\%80v.\+', -1)endif?
10 避免结尾空格
Emacs的用户也许相应设置这样的配置在他们的config中 (和前面的例子完美的结合起来):
(setq whitespace-style '(trailing space-before-tab indentation space-after-tab)){code}Vim Emacs的用户也许相应设置这样的配置在他们的 ~/.vimrc:{code}autocmd BufWritePre * :%s/\s\+$//e
?
语法
1 def使用括号当有参数的时候,忽略括号当没有参数
def some_method # body omitted end def some_method_with_arguments(arg1, arg2) # body omitted end?
2 不要使用for,除非你知道为什么。大部分的时候使用迭代器代替。for在each中被实现了(所以你是间接使用),不过for没有引入到一个新的范围中(不像each),而且在块中定义的变量外部仍然可见。
arr = [1, 2, 3]# badfor elem in arr do puts elemend# goodarr.each { |elem| puts elem }
?
3 在if/unless多行的时候不要使用then
# badif some_condition then # body omittedend# goodif some_condition # body omittedend?
4 比起if/then/else/end 结构更加喜爱使用三元运算符,它的更为普遍和明显更简洁。
# badresult = if some_condition then something else something_else end# goodresult = some_condition ? something : something_else?
5