空格 (Whitespace)

优质
小牛编辑
142浏览
2023-12-01

缩进 (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
  • 文件末尾只放一个空行。