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