2016-09-06 1 views
0

EDIT:誰かが私はので、私は質問を編集しています正しくbreakに必要なことを指摘し

シナリオ:
次のコードを参照してください。
Ruby - IFブロック内で何かを実行してからブレークする方法は?

print "UserID: " 
uid = $stdin.gets.chomp 
print "Password: " 
pwd = $stdin.gets.chomp 
usr_inp = "#{uid};#{pwd}" 
login_status = -1 
# login_info.txt - "#{userid};#{password}" - format 
File.open(File.join(File.dirname(__FILE__), 'login_info.txt'), "r") do |f| 
    f.each_line do |line| 
     puts line 
     if (line.chomp == usr_inp) 
      login_status = 1 
     elsif (line.chomp != usr_inp && line.include?(uid)) #case a person inputs invalid password 
      login_status = 0 
     elsif (line.chomp != usr_inp && !(line.include?(uid))) #case a person inputs an invalid id 
      login_status = 2 
     end 
    end 
end 
if (login_status == 1) 
    puts "\nLogged in successfully: #{uid}" 
elsif (login_status == 2) 
    puts "\nSorry, that Employee does not exist." 
elsif (login_status == 0) 
    puts "\nLogin failed.\nPlease check credentials." 
end 

問題:
break if (condition) Rubyに存在します。しかし、私はそれをwahtしないでください。たぶん私は、コードがどのように動作するかルビー理解していないのです

if (condition x) 
    (do something) 
    break 
elsif (condition y) 
    (do something else) 
    break 
else 
    (whatever) 
end 


は、私のような何かをしたいです。 breakを使用したいときはいつでも、それは次のelsifに関連付けられます。
助けてください。

+1

正しいユーザーIDとパスワードが見つかった場合は、ループから抜け出す必要があります。そうでない場合は、次の行がチェックされ、間違っています。 –

+0

@JonnyHenly:はい、この問題があります。私はルビーを壊すことはできません。 "break if(condition)"がありますが、 "login_status = 1"のようなブロックレベルの文を実行することはできません。どのように同時に何かを壊して実行するか? – Spandan

+0

それだけで 'break'を使うことはできませんか? http://stackoverflow.com/questions/8502397/ruby-syntax-break-out-from-each-do-block –

答えて

2

これは必要な場所と必要な場所によって異なります。

このようなスクリプト:

condition = 1 
case condition 
    when 1 
    puts 'one' 
    break 
    when 2 
    puts 'two' 
    else 
    puts 'Other %s' % condition 
    end 

puts 'end' 

に構文エラーがあります。 breakはループを残し、ループはありません。

しかしループで、これは動作します:

[1,2,3].each{|condition| 
    case condition 
    when 1 
     puts 'one' 
     break 
    when 2 
     puts 'two' 
    else 
     puts 'Other %s' % condition 
    end 
    puts 'end' 
    } 
    puts 'very end' 

出力は次のとおりです。

one 
very end 

あなたが見る、ループが停止しています。

あなたは次の要素でループを続けたい場合は、あなたが(申し訳ありませんが、私はちょうどbreakはJavaで実際にやっていることを認識していないんだ - それが私の最後のJavaプログラムから長い時間がかかった)nextが必要になります。

[1,2,3].each{|condition| 
    case condition 
    when 1 
     puts 'one' 
     next 
    when 2 
     puts 'two' 
    else 
     puts 'Other %s' % condition 
    end 
    puts 'end %s' % condition 
    } 
    puts 'very end' 

結果:

one 
two 
end 2 
Other 3 
end 3 
very end 

あなたは(あなたのコードスニペットのように)ループ内でない場合は、あなたが(メソッドを残す)exit(プログラムを終了)またはreturnを使用することができます。

+0

'File.each_line do ... end'をループと見なすことができますか?この 'do ... end'ブロックの中に' if'条件を書こうとしているからです。 – Spandan

+0

ただ試してみてください。 – knut

関連する問題