空格 (Whitespace)

缩进 (Indentation)

  • 始终用 2 个空格做缩进。[link]

  • when 的缩进和 case 一致。
    [link]

    1. case
    2. when song.name == 'Misty'
    3. puts 'Not again!'
    4. when song.duration > 120
    5. puts 'Too long!'
    6. when Time.now.hour > 21
    7. puts "It's too late"
    8. else
    9. song.play
    10. end
    11. kind = case year
    12. when 1850..1889 then 'Blues'
    13. when 1890..1909 then 'Ragtime'
    14. when 1910..1929 then 'New Orleans Jazz'
    15. when 1930..1939 then 'Swing'
    16. when 1940..1950 then 'Bebop'
    17. else 'Jazz'
    18. end
  • 函数的参数要么全部在同一行,如果参数要分成多行,则每行一个参数, 相同缩进。[link]

    1. # 错误
    2. def self.create_translation(phrase_id, phrase_key, target_locale,
    3. value, user_id, do_xss_check, allow_verification)
    4. ...
    5. end
    6. # 正确
    7. def self.create_translation(phrase_id,
    8. phrase_key,
    9. target_locale,
    10. value,
    11. user_id,
    12. do_xss_check,
    13. allow_verification)
    14. ...
    15. end
    16. # 正确
    17. def self.create_translation(
    18. phrase_id,
    19. phrase_key,
    20. target_locale,
    21. value,
    22. user_id,
    23. do_xss_check,
    24. allow_verification
    25. )
    26. ...
    27. end
  • 多行的布尔表达式,下一行缩进一下。[link]

    1. # 错误
    2. def is_eligible?(user)
    3. Trebuchet.current.launch?(ProgramEligibilityHelper::PROGRAM_TREBUCHET_FLAG) &&
    4. is_in_program?(user) &&
    5. program_not_expired
    6. end
    7. # 正确
    8. def is_eligible?(user)
    9. Trebuchet.current.launch?(ProgramEligibilityHelper::PROGRAM_TREBUCHET_FLAG) &&
    10. is_in_program?(user) &&
    11. program_not_expired
    12. end

行内 (Inline)

  • 行末不要留空格。
    [link]

  • 写行内注释的时候,在代码和注释之间放 1 个空格。
    [link]

    1. # 错误
    2. result = func(a, b)# we might want to change b to c
    3. # 正确
    4. result = func(a, b) # we might want to change b to c
  • 操作符两边放一个空格;逗号,冒号,分号后面都放一个空格;左大括号 { 两边放空格,右大括号 } 左边放空格。
    [link]

    1. sum = 1 + 2
    2. a, b = 1, 2
    3. 1 > 2 ? true : false; puts 'Hi'
    4. [1, 2, 3].each { |e| puts e }
  • 逗号前面永远不要放空格
    [link]

    1. result = func(a, b)
  • block 语法里,| | 内部的两边不应该带多余的空格,参数之间应该有1个空格,| | 后面应该有一个空格
    [link]

    1. # 错误
    2. {}.each { | x, y |puts x }
    3. # 正确
    4. {}.each { |x, y| puts x }
  • 感叹号和参数间不要留空格,下面是个正确的例子。[link]

    1. !something
  • (, [ 后面不要有空格
    ], ) 前面不要有空格
    [link]

    1. some(arg).other
    2. [1, 2, 3].length

  • 字符串插值时候忽略空格。[link]

    1. # 错误
    2. var = "This # { foobar } is interpolated."
    3. # 正确
    4. var = "This # {foobar} is interpolated."
  • 当表达范围时,不要写额外的空格。[link]

    1. # 错误
    2. (0 ... coll).each do |item|
    3. # 正确
    4. (0...coll).each do |item|

换行 (Newlines)

  • if 条件保持相同缩进,方便识别哪些是条件,哪些是内容。
    [link]

    1. if @reservation_alteration.checkin == @reservation.start_date &&
    2. @reservation_alteration.checkout == (@reservation.start_date + @reservation.nights)
    3. redirect_to_alteration @reservation_alteration
    4. end
  • 条件语句,块,case 语句,等等东西后面换一行, 例子如下。[link]

    1. if robot.is_awesome?
    2. send_robot_present
    3. end
    4. robot.add_trait(:human_like_intelligence)
  • 不同缩进的代码之间无需空行 (比如 class 或 module 和内容之间)。
    [link]

    1. # 错误
    2. class Foo
    3. def bar
    4. # body omitted
    5. end
    6. end
    7. # 正确
    8. class Foo
    9. def bar
    10. # body omitted
    11. end
    12. end
  • 方法之间 1 个空行就好。[link]

    1. def a
    2. end
    3. def b
    4. end
  • 1 个空行隔开类似的逻辑。
    [link]

    1. def transformorize_car
    2. car = manufacture(options)
    3. t = transformer(robot, disguise)
    4. car.after_market_mod!
    5. t.transform(car)
    6. car.assign_cool_name!
    7. fleet.add(car)
    8. car
    9. end
  • 文件末尾只放一个空行。
    [link]