代码之家  ›  专栏  ›  技术社区  ›  Pablo Olmos de Aguilera C.

如何为我的类实现链方法?

  •  0
  • Pablo Olmos de Aguilera C.  · 技术社区  · 7 年前

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

    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 不实现该方法。除了猴子修补 数组 同学们,有没有一个合适的或者更粗糙的方法?

    另一种选择是:

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

    但我找到了方法调用 ary_to_i(rows) 令人困惑。

    2 回复  |  直到 7 年前
        1
  •  1
  •   steenslag    7 年前

    你可以定义一个 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]]
    
        2
  •  1
  •   Aleksei Matiushkin    7 年前

    尽管它是一个反模式,但您可能会在 Array 班级:

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

    但我最好还是选择后者。


    司扥噢特: 改变数组不是一个最好的主意,但是如果你这样做了,选择以一个爆炸结尾的名称,就像我的例子中那样。