1
o = Object.new

class << o
  public :puts
end
o.puts "1. #{o.class.method_defined? :puts}"              => false
o.puts "2. #{o.class.method_defined? :public_methods}     => true

method_defined?まだ私に間違っていますか?プットをパブリックとして宣言したとしても、なぜですか?

4

2 に答える 2

2
o.class
=> Object

Object.method_defined? :puts
=> false

o.singleton_class
=> #<Class:#<Object:0x2b23858>>

o.singleton_class.method_defined? :puts
=> true

上記のコードは非常に明確な説明を示していると思います。オブジェクト自体を変更する場合は、元のクラスに追加したシングルトンメソッドが含まれていないためsingleton_classではなく、にアクセスするために使用する必要があります。class

于 2012-11-08T15:56:50.387 に答える
0

説明のためのドキュメントmethod_defined?

名前付きメソッドがmod(またはそれに含まれるモジュール、およびmodがクラスの場合はその祖先)によって定義されている場合はtrueを返します

そして、このpublicメソッドはアクセシビリティを設定するだけです。メソッド定義をオブジェクトのコンテキストに移動しません。

于 2012-11-08T15:50:00.527 に答える