Ruby:从数组动态创建函数调用参数列表

时间:2014-10-14 17:00:16

标签: ruby-on-rails ruby axlsx

我正在使用axlsx gem创建电子表格。我想在所有电子表格列上设置固定宽度,我需要调用函数

def column_widths(*widths)
  widths.each_with_index do |value, index|
    next if value == nil
    Axlsx::validate_unsigned_numeric(value) unless value == nil
    find_or_create_column_info(index).width = value
  end
end

Axlsx::Worksheet中定义,具有任意数量的列宽。例如。 `sheet.column_width(20,20,...,20)。我的方法调用看起来像

sheet.column_widths [20]*headers.length

导致错误

ActionView::Template::Error (Invalid Data [20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20] for Invalid column width. must be [Fixnum, Integer, Float].

如何为未知数量的列动态创建正确的方法调用?

1 个答案:

答案 0 :(得分:1)

您的问题是方法column_widths的定义如下:

def column_widths(*widths)
  # some stuff

参数*中出现的splatter运算符*widths表示您可以从1到N(其中N> 1)参数。您正在尝试将此方法与Integer数组一起使用,而应将每个Integer作为单个参数传递,例如:

sheet.column_widths(20, 20, 20, 20, #etc...

但这不是最好的方法。使用这些参数的一种更好的方法是使用splatter运算符:

sheet.column_widths(*[20]*headers.length)
                   #^ This is the splatter operator

一个非常明确的splatter运算符实用程序示例(在我的IRB控制台中,Ruby 1.9.3p489):

ann, marc, john = *['Ann', 'Marc', 'John']
# => ["Ann", "Marc", "John"] 
ann
# => "Ann"

关于splatter运算符的一些内容:http://4loc.wordpress.com/2009/01/16/the-splat-operator-in-ruby/