2013-07-27 12 views
6

編集:私は、Rubyのバージョン2.0.0「respond_to?」について混乱しています。方法

を使用していますI持つファイル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を返しますか?

+1

興味深い、ちょうどI?それをirbで実行し、それは私のために働いた。おそらく自分でそれを呼び出すことによって、もっと明白にしようとしましたか? 'puts self.respond_to?(:say_hello)' – AdamT

+0

self.respond_to(:say_hello)はfalseを返します。 – MichaelHajuddah

+0

実行中のRubyのバージョンは? – Shoe

答えて

11

トップレベルのメソッドがprivateとして定義され、Object#respond_to?は、デフォルトでプライベートメソッドを無視している(あなたはそれがsay_helloを認識するための第二引数を渡す必要があります):

def say_hello 
    puts 'hi' 
end 

puts respond_to?(:say_hello)     #=> false 
puts respond_to?(:say_hello, :include_private) #=> true 
say_hello 
+0

実際にはありません。 Ruby 1.9.3では、トップレベルメソッドはpublicとして定義されています。 – Shoe

+0

これをクリアしていただきありがとうございます!私は "puts private_methods.sort"を実行し、確かにsay_helloはプライベートメソッドとして現れました。 – MichaelHajuddah

+0

@Jeffrey:質問コメントから: "私はRuby 2.0.0を使用しています" –

3

この1は掘りの多くを取りました。

ここで説明したように、末尾に近いhttp://marakana.com/bookshelf/ruby_tutorial/scope.html: "どのクラスまたはモジュールの外にも定義されたメソッドは、Objectのプライベートメソッドになり、どこでも利用できます。"

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

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

...その他の回答には残りの情報が含まれています。

4

ルビー.respond_to?
はシンボルを取得し、オブジェクトがそのメソッドを受け取ることができる場合を返すrespond_to持っルビーではなく、Railsのためのチェック方法、他それは

あなたの最初のコードを持って返しますrespond_toの前にドットが見つからない()? ...私がそれを印刷したときにhloが本当の状態の確認を持っていなかった。

構文:object.respond_to(:メソッド)

- >[1,2,3,5,8,13] .respond_to?(:プッシュ)

関連する問題