Попытка переопределить + = в подклассе Array, похоже, ничего не дает? - PullRequest
1 голос
/ 10 октября 2011

В подклассе Array (просто массив, который выполняет некоторое принуждение входных значений), я определил #concat, чтобы обеспечить приведение значений. Поскольку никто никогда не использует #concat и с большей вероятностью использует #+=, я пытался присвоить псевдоним #+= #concat, но, похоже, он никогда не вызывался. Есть идеи?

Обратите внимание, что на самом деле принуждение всегда относится к объектам определенного суперкласса (который принимает ввод через конструктор), в случае, если этот код, кажется, не выполняет то, что я описываю. Это часть внутреннего частного API.

  class CoercedArray < Array
    def initialize(type)
      super()
      @type = type
    end

    def push(object)
      object = @type.new(object) unless object.kind_of?(@type)
      super
    end

    def <<(object)
      push(object)
    end

    def concat(other)
      raise ArgumentError, "Cannot append #{other.class} to #{self.class}<#{@type}>" unless other.kind_of?(Array)
      super(other.inject(CoercedArray.new(@type)) { |ary, v| ary.push(v) })
    end

    alias :"+=" :concat
  end

#concat работает правильно, но #+= кажется полностью обойденным.

1 Ответ

5 голосов
/ 10 октября 2011

Поскольку a += b является синтаксическим сахаром для a = a + b, я бы попытался переписать метод +.

...