1

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正しく動作してい#+=ますが、完全にバイパスされているようです。

4

1 に答える 1

5

a += b構文糖なので、メソッドa = a + bを上書きしようとします。+

于 2011-10-10T06:52:41.697 に答える