12

編集:Rubyバージョン2.0.0を使用しています

ファイルexample.rbに次のコードがあります

def say_hello
  puts 'hi'
end

puts respond_to?(:say_hello)
say_hello

このコードを実行すると、出力は次のようになります。

false
hi

「respond_to?」に対して false が返される理由がわかりません。私がその方法を使用できるとき。

「respond_to?」ただし、メソッドはこのように機能するようです:

class Person
  def say_bye
    puts 'bye'
  end
end

mike = Person.new
puts mike.respond_to?(:say_bye)
mike.say_bye

出力は次のとおりです。

true
bye

「respond_to」の理由について何か洞察を持っている人はいますか? 最初のケースで false を返しますか?

4

3 に答える 3

20

トップレベルのメソッドはプライベートとして定義され、Object#respond_to?デフォルトでプライベート メソッドを無視します (認識するには 2 番目の引数を渡す必要がありますsay_hello)。

def say_hello
  puts 'hi'
end

puts respond_to?(:say_hello)                    #=> false
puts respond_to?(:say_hello, :include_private)  #=> true
say_hello
于 2013-07-27T03:52:09.970 に答える
3

これはかなり掘り下げました。

ここで説明されているように、http://marakana.com/bookshelf/ruby_tutorial/scope.htmlの下部にある「クラスまたはモジュールの外部で定義されたメソッドは、オブジェクトのプライベート メソッドになり、どこでも使用できます。」

ファイルの最上位にある self は、「main」と呼ばれる特別なものです。

ここが面白い部分です。オブジェクトは、プライベート メソッドに応答することを拒否します。

...他の答えには残りの情報があります。

于 2013-07-27T04:06:21.547 に答える