- 空格 (Whitespace)
- 缩进 (Indentation)
- 行内 (Inline)
- 换行 (Newlines)
空格 (Whitespace)
缩进 (Indentation)
始终用 2 个空格做缩进。[link]
when的缩进和case一致。
[link]casewhen song.name == 'Misty'puts 'Not again!'when song.duration > 120puts 'Too long!'when Time.now.hour > 21puts "It's too late"elsesong.playendkind = case yearwhen 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
函数的参数要么全部在同一行,如果参数要分成多行,则每行一个参数, 相同缩进。[link]
# 错误def self.create_translation(phrase_id, phrase_key, target_locale,value, user_id, do_xss_check, allow_verification)...end# 正确def self.create_translation(phrase_id,phrase_key,target_locale,value,user_id,do_xss_check,allow_verification)...end# 正确def self.create_translation(phrase_id,phrase_key,target_locale,value,user_id,do_xss_check,allow_verification)...end
多行的布尔表达式,下一行缩进一下。[link]
# 错误def is_eligible?(user)Trebuchet.current.launch?(ProgramEligibilityHelper::PROGRAM_TREBUCHET_FLAG) &&is_in_program?(user) &&program_not_expiredend# 正确def is_eligible?(user)Trebuchet.current.launch?(ProgramEligibilityHelper::PROGRAM_TREBUCHET_FLAG) &&is_in_program?(user) &&program_not_expiredend
行内 (Inline)
行末不要留空格。
[link]写行内注释的时候,在代码和注释之间放 1 个空格。
[link]# 错误result = func(a, b)# we might want to change b to c# 正确result = func(a, b) # we might want to change b to c
操作符两边放一个空格;逗号,冒号,分号后面都放一个空格;左大括号
{两边放空格,右大括号}左边放空格。
[link]sum = 1 + 2a, b = 1, 21 > 2 ? true : false; puts 'Hi'[1, 2, 3].each { |e| puts e }
逗号前面永远不要放空格
[link]result = func(a, b)
block 语法里,| | 内部的两边不应该带多余的空格,参数之间应该有1个空格,| | 后面应该有一个空格
[link]# 错误{}.each { | x, y |puts x }# 正确{}.each { |x, y| puts x }
感叹号和参数间不要留空格,下面是个正确的例子。[link]
!something
(,[后面不要有空格
],)前面不要有空格
[link]some(arg).other[1, 2, 3].length
字符串插值时候忽略空格。[link]# 错误var = "This # { foobar } is interpolated."# 正确var = "This # {foobar} is interpolated."
当表达范围时,不要写额外的空格。[link]
# 错误(0 ... coll).each do |item|# 正确(0...coll).each do |item|
换行 (Newlines)
if 条件保持相同缩进,方便识别哪些是条件,哪些是内容。
[link]if @reservation_alteration.checkin == @reservation.start_date &&@reservation_alteration.checkout == (@reservation.start_date + @reservation.nights)redirect_to_alteration @reservation_alterationend
条件语句,块,case 语句,等等东西后面换一行, 例子如下。[link]
if robot.is_awesome?send_robot_presentendrobot.add_trait(:human_like_intelligence)
不同缩进的代码之间无需空行 (比如 class 或 module 和内容之间)。
[link]# 错误class Foodef bar# body omittedendend# 正确class Foodef bar# body omittedendend
方法之间 1 个空行就好。[link]
def aenddef bend
1 个空行隔开类似的逻辑。
[link]def transformorize_carcar = manufacture(options)t = transformer(robot, disguise)car.after_market_mod!t.transform(car)car.assign_cool_name!fleet.add(car)carend
文件末尾只放一个空行。
[link]
