【问题标题】:Ruby passing lots of argsRuby 传递了很多参数
【发布时间】:2011-12-09 17:27:55
【问题描述】:

我有一个接收大约 20 个参数的方法,在那个参数中我想将所有这些传递给另一个方法。我可以将它们全部传递给第二种方法而不重新输入它们吗?是否有一个 args 数组或我可以传递的东西?

我有什么:

def my_method(arg1, arg2, ..., arg20)
  #do some stuff
  my_second_method(arg1, arg2, ..., arg20)
  #do other stuff
end

我想要什么:

def my_method(arg1, arg2, ..., arg20)
  #do some stuff
  my_second_method(args[array])
  #do other stuff
end

【问题讨论】:

  • 我强烈建议不要有 20 个参数。
  • 还有人闻到什么味道吗?像个臭鸡蛋……

标签: ruby


【解决方案1】:

有一个接受这么多参数的方法is a code smell。这种方法几乎可以肯定是试图用太多不同种类的数据做太多事情。

也就是说,如果这是不可避免的,请尝试这种方法,使用 Ruby 的 splat 运算符。

  def one(*args)
    # process/validate args
    two(*args)     # Note that the splat is needed here too.
  end

  def two(*args)
    # do work
  end

【讨论】:

    【解决方案2】:

    您可以使用 Ruby 的 splat 运算符:

    def my_method(*args)
        # do some stuff
        my_second_method(*args)
        # do other stuff
    end
    
    def my_second_method(*args)
        # use args[0] through args[19]
    end
    

    【讨论】:

    • 我认为my_second_method(args) 应该改为my_second_method(*args)(如果Ruby 有模式匹配,那么[ie my_second_method(args)] 是可能的:))
    【解决方案3】:

    因此,这可能不是最好的主意,但话虽如此,您可以使用散列来管理参数。

    Rails 经常这样做:

    render :partial => "new", :locals => {:object => @my_object}
    

    Ruby 的 ActiveSupport 有一种方法可以解决这个问题,extract_options! 函数,在 simone carletti 's blog 上有详细说明

    【讨论】:

    • +1 有 20 个参数(如果确实需要的话),选项哈希是保持可读性的好方法。
    • ...或关键字参数,如果您使用的是 Ruby 2.0。
    【解决方案4】:
    def as_array(*args)
      if args.length == 3
        a, b, c = args
        puts "a=#{a} b=#{b} c=#{c}"
      end
    end
    
    
    as_array 1, 2, 3
    

    【讨论】:

      【解决方案5】:

      在 Ruby 代码中有一个常见的习惯用法:

      def method1(*args)
        method2(*args)
      end
      
      def method2(*args)
      end
      
      method1(a, b, c, d, e, f, g)
      

      注意 splat 运算符的使用方式。它基本上首先将 args 打包到一个数组中,然后在方法调用时将其解包回各个参数中。当您只需要将 args 进一步传递给另一个方法时,它非常方便,例如在初始化程序中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-27
        • 2015-02-17
        • 2015-03-13
        • 1970-01-01
        • 1970-01-01
        • 2011-01-14
        • 2016-02-27
        • 2011-08-05
        相关资源
        最近更新 更多