2012-03-07 18 views
3

このコードは、Rubyベストプラクティスという名前のブックから来ている:このルビーコードの何が問題なのですか?期待して構文エラー、予期しないtIDENTIFIERは、keyword_end

def respond_to?(message) 
    message = message.to_sym 
    [:__result__, :inspect].include?(message) || 
    __result__.respond_to? message 
end 

しかし、私はエラーを取得:keyword_end期待して、構文エラー、予期しないtIDENTIFIERを。どうしたの?

答えて

3

あなたがそう

def respond_to?(message) 
    message = message.to_sym 
    [:__result__, :inspect].include?(message) || 
    __result__.respond_to?(message) 
end 

かのように、いくつかのより多くの括弧を必要とする(しかし、醜悪に見える)何ルビーが理解され、とにかく

def respond_to?(message) 
    message = message.to_sym 
    [:__result__, :inspect].include?(message) || 
    (__result__.respond_to? message) 
end 

を:ので、オペレータの優先順位の

def respond_to?(message) 
    message = message.to_sym 
    ([:__result__, :inspect].include?(message) || 
    __result__.respond_to?) message 
end 

括弧を付けずに関数を呼び出すのが大好きですが、これはコードがあいまいでない場合にのみ便利です。rubyは||関数と同じように新しい行に優先順位を割り当てません。

+0

私の経験則は次のとおりです。戻り値を使用する場合は、括弧を付けずにメソッドを呼び出さないでください。それはパーサとコードの次の読者の混乱を避けます:) –

+0

...これは非常に厳密で、コードを分割する代入ではないので、このステートメントでは機能しませんが、 '||'しかし、それはまだ意味があります。 – ecoologic

+0

あなたは 'respond_to?(message)'を強制するでしょうから、そのような問題はありません。ああ、 '0'パラメータを持つメソッドには適用されません。 –

関連する問題