class_eval
instance_eval
メソッドの定義などの場合は、非常に予測可能です。また、クラスのインスタンスとクラスのシングルトン (別名固有クラス) の違いも理解しています。
しかし
次のような唯一のことを理解できません。たとえば、いくつかのストレージの目的で、既存のクラスをシングルトンにしたいとします。
class A; end
class B; end
A.class_eval do
private :new
end
B.instance_eval do
private :new
end
どちらの場合も得た
NameError: undefined method 'new' for class
Did you mean? new
はい、私はまさにこの方法を意味します。
self
さらに、これら 2 つのバリアントは、どちらの場合もクラス オブジェクトのポイントのように、同じ結果をもたらします。
A.class_eval do
class << self
private :new
end
end
A.new
=> NoMethodError: private method 'new' called for A:Class
B.instance_eval do
class << self
private :new
end
end
B.new
=> NoMethodError: private method 'new' called for B:Class
どうして?誰でもこれに光を当てることができますか?