0

今日、コードをステップ実行しているときに、予期しないことに気付きました。この文:

もし Object.respond_to? :こんにちは && Object.hello #stuff

未定義のメソッド エラーを返します。しかし、なぜ?明らかに、hello は Object の有効なメソッドではありませんが、短絡評価を考えると、Object.respond_to のたびに Object.hello を無視するべきではありませんか? :こんにちは偽ですか?

UserSession クラスが永続化を定義する必要がある理由を正確に理解しようとして、Authlogic で遊んでいるときにこれに気付きました。Rails 3で。

ありがとう

4

4 に答える 4

4

括弧がないと、優先順位の問題が発生します。

>> Object.respond_to? :hello && Object.hello
NoMethodError: undefined method `hello' for Object:Class
    from (irb):2
    from /Users/john/.rvm/rubies/ruby-1.9.2-p136/bin/irb:16:in `<main>'
>> Object.respond_to?(:hello) && Object.hello
=> false
于 2011-02-23T05:10:51.147 に答える
2

優先順位の問題があります。論理積 ( &&) はメソッド呼び出しよりも優先順位が高いため、例は次のように実行されます。

if Object.respond_to?(:hello && Object.hello)

このようではありません:

if Object.respond_to?(:hello) && Object.hello

これはあなたが想定しているものです。

于 2011-02-23T05:12:50.333 に答える
1

評価順序の問題が発生していると思います。次のことを考慮してください。

Object.respond_to? :hello && true 
于 2011-02-23T04:58:54.220 に答える
-3

if ステートメントで何かの状態をチェックしている場合は、ブール値の応答を探しています。メソッドが存在しないため、Object.hello は false を返しません。あなたの小切手:

Object.respond_to? :hello

ただし、その応答を確認しています。2 番目の Object.hello に対する私のオプションでは、理由は何もないはずです。

于 2011-02-23T05:01:45.780 に答える