2016-09-22 7 views
9

を、 私はRubyの&& returnをテストするためのテストプログラムを書いた、と私は、この奇妙な動作を得た:ルビー:「&&リターン」対「と返す」<a href="http://guides.rubyonrails.org/layouts_and_rendering.html#avoiding-double-render-errors" rel="nofollow noreferrer">http://guides.rubyonrails.org/layouts_and_rendering.html#avoiding-double-render-errors</a>でガイドレールを通過しながら

def test1 
    puts 'hello' && return 
    puts 'world' 
end 

def test2 
    puts 'hello' and return 
    puts 'world' 
end 

これは、結果出力:

irb(main):028:0> test1 
=> nil 
irb(main):029:0> test2 
hello 
world 
=> nil 

どのような違いがありますか?

+0

こんにちは、ここでの議論:https://www.ruby-forum.com/topic/217700 – Yarin

答えて

16

チェックアウトthe difference between and and &&この例では、メソッドputsを引数の周りに括弧を付けずに呼び出すと、優先順位の違いによって解析方法が変わります。

テスト中1 &&は、メソッド呼び出しよりも優先順位が高くなります。実際に起こっていることはputs('hello' && return)です。引数は、呼び出されるメソッドの前に常に評価されるため、最初に'hello' && returnを評価します。 'hello'は真実であるためブール値は短絡せず、returnが評価されます。戻り時には、何もせずにメソッドを終了します。したがって、何もログに記録されず、2行目は実行されません。

テスト2 andは、メソッド呼び出しよりも優先順位が低くなります。何が起こるかはputs('hello') and returnです。 putsメソッドは、渡されたものを記録し、nilを返します。 nilは偽の値であるため、and表現の短絡とreturnの式は決して評価されません。我々はputs 'world'が実行されている2行目に移動します。

+0

ありがとうございます!私は問題が~~ですが、 "&&はメソッド呼び出しよりも優先順位が高い場所を見ることができません。" http://phrogz.net/ProgrammingRuby/language.html#table_18.4に存在します。私はそれを証明できません... – Spec

関連する問題

 関連する問題