我有一个接收大约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
答案 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进一步传递给另一个方法时,例如在初始化器中,它非常方便。