2016-11-11 6 views
3

次のコードを使用する:Rubyでは、ループ内の戻り値は何ですか?

def get_action 
    action = nil 
    until Guide::Config.actions.include?(action) 
     puts "Actions: " + Guide::Config.actions.join(", ") 
     print "> " 
     user_response = gets.chomp 
     action = user_response.downcase.strip 
    end 
    return action 
    end 

を次のコードは、ユーザ応答を取り、最終的に別の方法でそのアクションを返します。

私は、ループが最終的に壊れるまで繰り返しますが、戻り値が不思議であることを知っていますので、次回のループの構造を改善することができます。 untilループでは、返り値があれば、どのような値がループ戻り値を返すのか不思議です。

+0

'x = until .... end'ならあなたは何を求めていますか? –

+0

戻り値が何らかの条件....終わりまで(この例である必要はないが一般的に)ループの中にあるかどうかを尋ねる、メソッドの戻り値が最後の行'return'キーワードが使われます – developer098

+0

' return'はループを壊します。代入 'x = ... etc'はミットのように、' n'を 'x'に代入します。 –

答えて

3

ループ(loopwhileuntil、など)のリターンは、あなたがbreak

def get_action 
    loop do 
    action = gets.chomp 
    break action if Guide::Config.actions.include?(action) 
    end 
end 

または

def get_action 
    while action = gets.chomp 
    break action if Guide::Config.actions.include?(action) 
    end 
end 

に送る何もすることができます。また、使用することができますbegin .. while

def get_action 
    begin 
    action = gets.chomp 
    end while Guide::Config.actions.include?(action) 
    action 
end 

またはイブ

def get_action 
    action = gets.chomp while Guide::Config.actions.include?(action) 
    action 
end 

PS nは短い:あなたが明示的break "something"を使用しない限り、自身が(break nilあるbreak暗黙の)結果としてnilを返すループ。ループの結果を代入したい場合は、breakを使用してください:x = loop do break 1; end

+0

ループは何も返しません。あなたが 'break'ステートメントを置いて、' break'ステートメントはメソッドの 'return'と同様に動作しますか? – developer098

+0

breakはループ自体から何かを返すので、変数に代入してメソッドの実行を続けることができます。 'return'はすぐにメソッドを終了します。 – fl00r

+1

@ programmer321:はい、 'break'はa)直ちにループを終了し、b)ループは' return'がメソッド(またはラムダ)を直ちに終了するのとまったく同じ方法で 'break'に渡された値に評価させます。メソッド呼び出しを 'return'に渡された値に評価させ、' next'はブロックを直ちに終了し、ブロックを 'next'に渡される値に評価させます。主な違いは、それぞれのキーワードが使用されていない場合に起こることです:ブロック、メソッド、ラムダ(同様にモジュールとクラスの定義)は、評価された最後の式の値を評価します –

関連する問題