2

このnextステートメントは、ループの一部をスキップして、ループの次の反復を続行するために使用されます。forandwhileステートメントと組み合わせて使用​​できます。

いくつかの条件が評価された後に複雑なコードがある場合、次を使用している人を見てきました。

next if @state!=:some_state
# some long complicated code

今ここで私は以下のようnextに私の中で遊んだ:IRB

n = 1
loop do
  n = n + 1
  next unless n == 10
  print "Good"
  break
end
# Good=> nil

上の方は了解しました。きれいにクリア。

n = 1
#=> 1
loop do
  print "#{n}"
  n = n + 1
  next puts "hi" unless n == 5
  p "good"
  break
end
#1hi
#2hi
#3hi
#4"good"
#=> nil

puts "hi"上記のコードでは、行とunless n == 5実行の順序がわかりませんでした。どちらが最初に実行されましたか?

以下は につながりますinfinite Loop

n = 1
#=> 1
loop do
  print "#{n}"
  n = n + 1
  next puts "hi"; 2 + 3 unless n == 5
  p "good"
  break
end

一方、これは良いです:

n = 1
#=> 1
loop do
  print "#{n}"
  n = n + 1
  next puts "hi", 2 + 3 unless n == 5
  p "good"
  break
end

#1hi
#5
#2hi
#5
#3hi
#5
#4"good"
#=> nil

ここで理解するのを手伝ってください-これはそのforeverループをどのように解決しますか?

4

2 に答える 2

6

セミコロンは改行として評価されるため、次のようになります。

next puts "hi"; 2 + 3 unless n == 5

次と同等です。

next puts "hi"
2 + 3 unless n == 5

したがって、next常に呼び出され、無限ループが発生します。

コンマは一連の引数 (putsメソッド シグネチャによって配列として解釈される) を渡すものとして評価されるため、次のようになります。

next puts "hi", 2 + 3 unless n == 5

次と同等です。

next puts("hi", 2 + 3) unless n == 5

putsand -の実行順序についてはunless、次の点を考慮してください。

unless n == 5
  next puts "hi"
end

この例では、unlessが最初に評価され、渡された条件が false と評価された場合にnext puts "hi"ステートメントが実行されることは明らかです。良い:

next puts "hi" unless n == 5

はまったく同じことの省略形です。したがって、unless修飾子は常に最初に評価されます。当然、途中にセミコロンを挿入すると、セミコロンは改行として評価されるため、異なる評価が行われます。

于 2013-03-04T21:57:21.847 に答える
0

条件を最初に実行する必要があります。そうでない場合、ステートメントに関連する式を評価するかどうかをどのように知ることができますか?

2番目の質問に関しては、次の式の値はループでは無視されます。式の値は、ブロックから値を返す場合にのみ役立ちます。したがって、ループを終了させるのはブレークだけです。

于 2013-03-05T02:50:15.707 に答える