如何为我的班级实施链式方法?

时间:2018-11-25 16:22:15

标签: arrays ruby type-conversion

我正在处理一个必须转换为二维数组的字符串:

rows = [['1', '2'], ['10', '20']]

我需要这些值作为整数而不是字符串。我可以遍历它们,然后执行map,例如:

rows.each {|row| row.map!(&:to_i)}

我试图创建一个可链接的to_i方法,因此我可以运行rows.to_i

def to_i
  each do |nested|
    nested.map!(&:to_i)
  end
end

这毫不奇怪地失败了:

NoMethodError: undefined method `to_i' for [["1", "2"], ["10", "20"]]:Array

因为Array未实现该方法。除了修补Array类的猴子以外,还有其他合适的方法吗?

另一种替代方法是:

def ary_to_i array
  array.each do |nested|
    nested.map!(&:to_i)
  end
end

但是我发现方法调用ary_to_i(rows)令人困惑。

2 个答案:

答案 0 :(得分:1)

尽管这是一种反模式,但您可以猴子修补""类:

showvalues1

但是我最好在OP中使用后者。


边注:改变数组从来都不是一个好主意,但是如果您这样做,请像我的示例一样选择一个以bang结尾的名称。

答案 1 :(得分:1)

您可以仅为行定义to_i方法:

rows = [['1','2'], ['10','20']]

def rows.to_i
  each do |nested|
    nested.map!(&:to_i)
  end
end

p rows.to_i # => [[1, 2], [10, 20]]