Ruby传递了很多args

时间:2011-12-09 17:27:55

标签: ruby

我有一个接收大约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

5 个答案:

答案 0 :(得分:8)

拥有接受许多参数 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

答案 1 :(得分:5)

您可以使用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

答案 2 :(得分:3)

所以,这可能不是最好的主意,但话说回来,您可以使用哈希来管理参数。

Rails做了很多事情:

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

Ruby的ActiveSupport有办法解决这个extract_options!函数,详见simone carletti 's blog

答案 3 :(得分:0)

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

答案 4 :(得分:0)

你可以在Ruby代码中看到一个常见的习语:

def method1(*args)
  method2(*args)
end

def method2(*args)
end

method1(a, b, c, d, e, f, g)

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