1. 缩进 (Indentation)

缩进 (Indentation)

  • 始终用 2 个空格做缩进。
  • when 的缩进和 case 一致。
      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
    
  • 函数的参数要么全部在同一行,如果参数要分成多行,则每行一个参数,相同缩进。
      #  错误
      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
    
  • 多行的布尔表达式,下一行缩进一下。
      #  错误
      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)

  • 行末不要留空格。
  • 写行内注释的时候,在代码和注释之间放 1 个空格。
      #  错误
      result = func(a, b)#  we might want to change b to c
      #  正确
      result = func(a, b) #  we might want to change b to c
    
  • 操作符两边放一个空格;逗号,冒号,分号后面都放一个空格;左大括号 { 两边放空格,右大括号 } 左边放空格。
      sum = 1 + 2
      a, b = 1, 2
      1 > 2 ? true : false; puts 'Hi'
      [1, 2, 3].each { |e| puts e }
    
  • 逗号前面永远不要放空格
      result = func(a, b)
    
  • block 语法里,| | 内部的两边不应该带多余的空格,参数之间应该有1个空格,| | 后面应该有一个空格
      #  错误
      {}.each { | x,  y |puts x }
      #  正确
      {}.each { |x, y| puts x }
    
  • 感叹号和参数间不要留空格,下面是个正确的例子。
      !something
    
  • (, [ 后面不要有空格,], ) 前面不要有空格
      some(arg).other
      [1, 2, 3].length
    
  • 字符串插值时候忽略空格。
      #  错误
      var = "This # { foobar } is interpolated."
      #  正确
      var = "This # {foobar} is interpolated."
    
  • 当表达范围时,不要写额外的空格。
      #  错误
      (0 ... coll).each do |item|
      #  正确
      (0...coll).each do |item|
    

换行 (Newlines)

  • if 条件保持相同缩进,方便识别哪些是条件,哪些是内容。
      if @reservation_alteration.checkin == @reservation.start_date &&
         @reservation_alteration.checkout == (@reservation.start_date + @reservation.nights)
        redirect_to_alteration @reservation_alteration
      end
    
  • 条件语句,块,case 语句,等等东西后面换一行, 例子如下。
      if robot.is_awesome?
        send_robot_present
      end
      robot.add_trait(:human_like_intelligence)
    
  • 不同缩进的代码之间无需空行 (比如 class 或 module 和内容之间)。
      #  错误
      class Foo
        def bar
          #  body omitted
        end
      end
      #  正确
      class Foo
        def bar
          #  body omitted
        end
      end
    
  • 方法之间 1 个空行就好。
      def a
      end
      def b
      end
    
  • 1 个空行隔开类似的逻辑。
      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
    
  • 文件末尾只放一个空行。