主页 > 知识库 > 网络编程 > Ruby >

Ruby 编程风格介绍(2)

来源:ruby-china 作者:网络 发表于:2012-06-20 09:50  点击:
Textmate Emacs用户可以将如下内容加入配置中(最好是接在上面的例子之后): (setq whitespace-style (trailing space-before-tab indentation space-after-tab)) Vim用户可以将以下内容添加至 ~/.vimrc : autocmd
  • Textmate
  • Emacs用户可以将如下内容加入配置中(最好是接在上面的例子之后):
    (setq whitespace-style '(trailing space-before-tab
                             indentation space-after-tab))
    
  • Vim用户可以将以下内容添加至~/.vimrc
    autocmd BufWritePre * :%s/\s\+$//e
    
    如果你不希望Vim破坏一些基于空格符的文件,你可以这样做:
    set listchars+=trail:░
    
    如果你不喜欢上面的建议,你也可以使用其它的字符来代替上面的。
  • Textmate用户可以看一下 Uber Glory bundle.
  • 避免行尾空白符。
  • Syntax

    • 在有参数时为def加上括号,在方法不接受任何参数时省略括号。
      def some_method
        # body omitted
      end
      
      def some_method_with_arguments(arg1, arg2)
        # body omitted
      end
      
    • 不要使用for,除非你很清楚为什么需要这么做。绝大多数情况下都可以使用each来代替for。要注意的是,for不会开启一个新的作用域(正好与each相反),在其中定义的变量在其外是可见的。
      arr = [1, 2, 3]
      
      # 不好的
      for elem in arr do
        puts elem
      end
      
      # 好的
      arr.each { |elem| puts elem }
      
    • 不要在跨行的if/unless中使用then
      # 不好的
      if some_condition then
        # body omitted
      end
      
      # 好的
      if some_condition
        # body omitted
      end
      
    • 使用条件运算符而不是if/then/else/end,它们最通用并且更简洁。
      # 不好的
      result = if some_condition then something else something_else end
      
      # 好的
      result = some_condition ? something : something_else
      
    • 在条件运算符中确保每个分支只包含一个表达式。即条件运算符在使用时不要嵌套,这种时候if/else是更好的选择。
      # 不好的
      some_condition ? (nested_condition ? nested_something : nested_something_else) : something_else
      
      # 好的
      if some_condition
        nested_condition ? nested_something : nested_something_else
      else
        something_else
      end
      
    • 不要使用if x: ...,它在Ruby 1.9中被移除了,使用条件运算符代替。
      # 不好的
      result = if some_condition: something else something_else end
      
      # 好的
      result = some_condition ? something : something_else
      
    • 在单行使用when时使,用when x then ...,另一个语法when x: ...在Ruby 1.9中被移除了。
    • 不要使用when x: ...,原因看上一条。
    • 在布尔表达式中使用&&/||,在流程控制时使用and/or(如果你在使用时发现需要添加额外的括号来表达逻辑,这说明你很可能用错了运算符)。
      # 布尔表达式
      if some_condition && some_other_condition
        do_something
      end
      
      # 流程控制
      document.saved? or document.save!
      
    • 语句跨行时不要使用?:(条件运算符),使用if/unless替代。
    • 在执行体仅有一行的情况下使用作为修饰符形式的if/unless。另一个选择是使用and/or来做流程控制。
      # 不好的
      if some_condition
        do_something
      end
      
      # 好的
      do_something if some_condition
      
      # 另一个好的选择
      some_condition and do_something
      
    • 在表示否定语义时使用unless而不是if(或者可以使用or做流程控制)。
      # 不好的
      do_something if !some_condition
      
      # 好的
      do_something unless some_condition
      
      # 另一个好的选择
      some_condition or do_something
      
    • 不要将unlesselse一起使用,将其的语义重写为肯定形式。
      # 不好的
      unless success?
        puts 'failure'
      else
        puts 'success'
      end
      
      # 好的
      if success?
        puts 'success'
      else
        puts 'failure'
      end
      
    • 不要在if/unless/while之后使用括号,除非条件中包含了赋值操作(参看下方关于使用=返回结果的部分)。
      # 不好的
      if (x > 10)
        # body omitted
      end
      
      # 好的
      if x > 10
        # body omitted
      end
      
      # 好的
      if (x = self.next_value)
        # body omitted
      end
      
    • 在使用DSL(如Rake,Rails,RSpec)定义的方法,以及Ruby中看起来像关键字的方法时(如attr_readerputs,属性的访问)忽略其参数两边的括号。其它的情况下则使用括号将参数包裹起来。
      class Person
        attr_reader :name, :age
      
        # omitted
      end
      
      temperance = Person.new('Temperance', 30)
      temperance.name
      
      puts temperance.age
      
      x = Math.sin(y)
      array.delete(e)
      
    • 在代码块只有一行的情况下使用{...}而不是do...end。避免在代码块跨行时使用{...}(同样避免跨行时进行链式调用,如下方代码中最后一例)。在流程控制及方法定义(如Rakefiles或其它DSL)时使使用

    有帮助
    (0)
    0%
    没帮助
    (0)
    0%