1

私はと呼ばれるモデルを持っており、Clientクライアント(実際の種類)がクラスレベルの変更を必要とする変更を行っている特定の場合にそれを複製したいと思います。

たとえば、私が持っている場合:

class Client
  set_table_name :clients

  def some_method
    puts "Hello"
  end
end

次に、次の場合:

module ClientA
  def some_method
    puts "World"
  end
end

クラスのクローンを作成(または複製)してから、モジュールを含めてメソッドを上書きできると思いますsome_method

しかし、これが私の本番コンソールで起こることです:

> CA = Client.dup
> CA.singleton_class.send(:include, ClientA) # Or just CA.send(:include, ClientA)
> client = CA.new
> client.some_method
=> "Hello" # Expected "World"

これにトリックはありますか?

4

2 に答える 2

1

ClientをサブクラスClient.dup化するuseの代わりに。Class.new(Client)

あなたがそれを避けようとしているなら、これはうまくいくようですClient.dup

CA.send(:define_method, :some_method) do 
  puts "World"
end
于 2012-12-17T19:06:55.430 に答える
1

モジュールのデータで特定のクラスをオーバーライドする場合は、それを拡張する必要があります。

client = Client.new
client.extend(ClientA)
client.some_method
=> "World"

あなたはそれがここで働くのを見ることができます:http://rubyfiddle.com/riddles/7621e

于 2012-12-17T19:09:43.130 に答える