69

我在这样的rails帮助文件中有一个方法

def table_for(collection, *args)
 options = args.extract_options!
 ...
end

我希望能够像这样调用这个方法

args = [:name, :description, :start_date, :end_date]
table_for(@things, args)

这样我就可以根据表单提交动态传递参数。我不能重写方法,因为我用的地方太多了,我该怎么做呢?

4

3 回答 3

94

Ruby 可以很好地处理多个参数。

这是一个很好的例子。

def table_for(collection, *args)
  p collection: collection, args: args
end

table_for("one")
#=> {:collection=>"one", :args=>[]}

table_for("one", "two")
#=> {:collection=>"one", :args=>["two"]}

table_for "one", "two", "three"
#=> {:collection=>"one", :args=>["two", "three"]}

table_for("one", "two", "three")
#=> {:collection=>"one", :args=>["two", "three"]}

table_for("one", ["two", "three"])
#=> {:collection=>"one", :args=>[["two", "three"]]}

(从 irb 剪切和粘贴的输出)

于 2009-05-06T19:23:15.577 回答
68

只需这样称呼它:

table_for(@things, *args)

( splat)*运算符将完成这项工作,而无需修改方法。

于 2009-05-06T19:11:48.197 回答
0
class Hello
  $i=0
  def read(*test)
    $tmp=test.length
    $tmp=$tmp-1
    while($i<=$tmp)
      puts "welcome #{test[$i]}"
      $i=$i+1
    end
  end
end

p Hello.new.read('johny','vasu','shukkoor')
# => welcome johny
# => welcome vasu
# => welcome shukkoor
于 2015-06-18T09:30:01.340 回答