1

ここでは、2つの類似したスクリプトが非常に奇妙な動作を示しています。

A)以下のコードは:をスローしていnil can't be coerced into Fixnum (TypeError)ます

    score = 0
    ammount = 4

    score += case ammount
      when ammount >= 3; 10
      when ammount < 3; 1
    end

    puts score

B)そしてこのもう1つは1コンソールログに入れています。

    score = 0
    ammount = 4

    score += case ammount
      when ammount >= 3; 10
      else 1
    end

    puts score

10両方のスクリプトがコンソールに出力されることを期待します。私が間違っている?なんで?

4

3 に答える 3

5

引数が与えられると、caseステートメントはオブジェクトの同等性(呼び出しと同じ===)をチェックします。これは、単一の値または範囲を超えて使用できます。あなたの場合、あなたは実際に平等をチェックしていませんが、それは次のように書くことができます:

score += case
         when amount >= 3 then 10
         when amount < 3 then 1
         end

ただし、これはあなたがやろうとしていること(どちらか/または条件)に対してかなり冗長です。if...elseプレーンステートメントまたは3項ステートメントを使用する方が簡単です。

score += amount >= 3 ? 10 : 1
于 2012-11-09T23:13:27.693 に答える
1

次の 2 種類の case ステートメントを混在させています。

  1. case variable
    when range/expression then ...
    else statement
    end
    
  2. case
    when case1 then ...
    else ...
    end
    

質問:

コードが機能しないのはなぜですか?

答え:

で変数を指定するcaseと、暗黙的な操作が各テスト===に適用されます。whenあなたの場合、amountは 4 で、3 より大きい場合、amount>=3 はtrueであるため、最初の when は if をテストしますamount === true。どうやらそうではないので、次の場合に次に進み、falseそれも偽ではないため、case ステートメントが返さnilれ、次のエラーが表示されますnil class cannot be coerced

2番目の条件についても同じです。

正しい解決策は、上記のいずれかを使用することです。

また:

score = 0
ammount = 4

score += case
  when ammount >= 3; 10
  when ammount < 3; 1
end

また:

score = 0
ammount = 4

score += case ammount
  when 3..(1.0/0.0); 10
  when -(1.0/0.0)...3; 1
end
于 2012-11-09T23:21:53.963 に答える
0

「;」の代わりに「then」を使用する必要があります。ケースの中で ammount 変数を宣言せず、そこにある句を使用するだけです。三項演算を使用して、必要な結果を得る方がはるかに簡単です。

score += ammount >= 3 ? 10 : 1
于 2012-11-09T23:17:39.537 に答える