3. 方法 (Methods)

方法定义 (Method definitions)

  • 函数要接参数的时候就用括号, 不用参数时就不用写括号了。 下面是正确的例子:
       def some_method
         #  body omitted
       end
       def some_method_with_parameters(arg1, arg2)
         #  body omitted
       end
    
  • 不要用默认参数,用一个选项 hash 来做这个事。
      #  错误
      def obliterate(things, gently = true, except = [], at = Time.now)
        ...
      end
      #  正确
      def obliterate(things, options = {})
        default_options = {
          :gently => true, #  obliterate with soft-delete
          :except => [], #  skip obliterating these things
          :at => Time.now, #  don't obliterate them until later
        }
        options.reverse_merge!(default_options)
        ...
      end
    
  • 避免定义单行函数,虽然有些人喜欢这样写,但是这样容易引起一些奇怪的问题。
      #  错误
      def too_much; something; something_else; end
      #  正确
      def some_method
        #  body
      end
    

方法调用 (Method calls)

应该用 圆括号 的情况:

  • 如果方法会返回值。
      #  错误
      @current_user = User.find_by_id 1964192
      #  正确
      @current_user = User.find_by_id(1964192)
    
  • 如果第一个参数需要圆括号。
      #  错误
      put! (x + y) % len, value
      #  正确
      put!((x + y) % len, value)
    
  • 方法名和左括号之间永远不要放空格。
      #  错误
      f (3 + 2) + 1
      #  正确
      f(3 + 2) + 1
    
  • 对于不用接收参数的方法, 忽略圆括号
      #  错误
      nil?()
      #  正确
      nil?
    
  • 如果方法不返回值 (或者我们不关心返回值),那么带不带括号都行。(如果参数会导致代码多于一行, 建议加个括号比较有可读性)
      #  okay
      render(:partial => 'foo')
      #  okay
      render :partial => 'foo'
    
  • 不论什么情况,如果一个方法的最后一个参数接收 hash, 那么不需要 { }
      #  错误
      get '/v1/reservations', { :id => 54875 }
      #  正确
      get '/v1/reservations', :id => 54875