缩进 (Indentation)

空格 (Whitespace)

缩进 (Indentation)

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

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

  case
  when 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.play
  end

  kind = 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
  • 函数的参数要么全部在同一行,如果参数要分成多行,则每行一个参数, 相同缩进。[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_expired
  end

  #  正确
  def is_eligible?(user)
    Trebuchet.current.launch?(ProgramEligibilityHelper::PROGRAM_TREBUCHET_FLAG) &&
      is_in_program?(user) &&
      program_not_expired
  end

行内 (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 + 2
  a, b = 1, 2
  1 > 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_alteration
  end
  • 条件语句,块,case 语句,等等东西后面换一行, 例子如下。[link]
  if robot.is_awesome?
    send_robot_present
  end

  robot.add_trait(:human_like_intelligence)
  • 不同缩进的代码之间无需空行 (比如 class 或 module 和内容之间)。
    [link]
  #  错误
  class Foo

    def bar
      #  body omitted
    end

  end

  #  正确
  class Foo
    def bar
      #  body omitted
    end
  end
  • 方法之间 1 个空行就好。[link]
  def a
  end

  def b
  end
  • 1 个空行隔开类似的逻辑。
    [link]
  def transformorize_car
    car = manufacture(options)
    t = transformer(robot, disguise)

    car.after_market_mod!
    t.transform(car)
    car.assign_cool_name!

    fleet.add(car)
    car
  end
  • 文件末尾只放一个空行。
    [link]