15

どのように応答するかはあまり明白ではないかもしれません。ルビーで動作します。次のことを考慮してください。


class A

   def public_method
   end

   protected
   def protected_method
   end

   private
   def private_method
   end

end

obj = A.new
obj.respond_to?(:public_method)
# true - that's pretty obvious
obj.respond_to?(:private_method)
# false - as expected
obj.respond_to?(:protected_method)
# true - WTF?

したがって、「obj」が protected_method に応答する場合、期待する必要があります

obj.protected_method

例外を発生させないでくださいね。

...しかし、明らかに上昇します

ドキュメンテーションは、respond_to? を呼び出すことを指摘していますか? 2 番目の引数を true に設定すると、プライベート メソッドもチェックされます

obj.respond_to?(:private_method, true)
# true

そして、それははるかに合理的です

問題は、オブジェクトがパブリック メソッドのみに応答するかどうかを確認する方法です。それよりも良い解決策はありますか?

obj.methods.include?(:public_method)
# true
obj.methods.include?(:protected_method)
# false
4

2 に答える 2

12

ドキュメントから:

obj が指定されたメソッドに応答する場合、true を返します。オプションの 2 番目のパラメーターが true と評価された場合にのみ、プライベートメソッドと保護されたメソッドが検索に含まれます。

質問が書かれたとき(Ruby 1.8.7):

obj が指定されたメソッドに応答する場合、true を返します。オプションの 2 番目のパラメーターが true と評価された場合にのみ、プライベート メソッドが検索に含まれます。

于 2014-06-25T15:40:15.320 に答える
9

respond_to?保護されたメソッドを探すべきかどうかは議論中です(この問題を確認してください)

Matz は、Ruby 2.0 でおそらく変更されるだろうと述べています。

一部のクラスは使用#method_missingおよび特殊化する可能性があることに注意してください#respond_to?(または#respond_to_missing?、Ruby 1.9.2 以降では a を指定することでより適切になります)。その場合、obj.methods.include?信頼性が低くなります。

于 2010-04-03T00:28:38.920 に答える