3

基本的に、私は一連の Rspec 命令に答えようとしています。それらの指示の1つはこれです:

it "fails informatively when there's not enough values stacked away" do
  expect {
     calculator.plus
  }.to raise_error("calculator is empty")
end

だから私は raise_error とそれに答える方法について学びました。何らかのエラー/例外を作成するのは私でした。

def plus
  @array_nums.length >= 2 ? @array_nums << @array_nums.pop + @array_nums.pop : raise {"calculator is empty"}
  @value = @array_nums[-1]

明確にするために、一番下に終わりがありますが、テキスト エディターはそれを処理していませんでした。だから私はエラーを発生させています.ArgumentErrorなどを発生させようとしましたが、rspecからこの応答を受け取り続けています:

Failure/Error:
   expect {
     calculator.plus
   }.to raise_error("calculator is empty")

   expected Exception with "calculator is empty", got RuntimeError with backtrace:
     # ./lib/12_rpn_calculator.rb:16:in `plus'
     # ./spec/12_rpn_calculator_spec.rb:119:in `block (3 levels) in <top (required)>'
     # ./spec/12_rpn_calculator_spec.rb:118:in `block (2 levels) in <top (required)>'
 # ./spec/12_rpn_calculator_spec.rb:118:in `block (2 levels) in <top (required)>'

私が試みた他の発生したエラーは機能しません。これを行う正しい方向を見つけるのに苦労しています。多分私は間違った場所を探していますか?

この質問をもう一度して申し訳ありませんが、私はすべてを試しましたが、エラーは発生したくありません。他のスレッドのコメントを確認したい場合はこちらのURLです。

4

2 に答える 2

3

ここでの主な問題は、ブロック ( ) をパラメーターとしてKernel#raise受け入れないことです。{...}例外または文字列を受け入れます。

あなたが直面している次の問題は、括弧の欠落です。多くの場合、括弧は省略できますが、常に省略できるわけではありません。その理由は、演算子の優先順位が異なるためです。演算子の優先順位は、開発者を混乱させ、Ruby が予期しない方法でコードを読み取る可能性があります。例えば:

condition ? operation : raise "calculator is empty"

# what the devs thinks Ruby would understand:
condition ? operation : raise("calculator is empty")

# what Ruby really understands:
(condition ? operation : raise) "calculator is empty"

実際、ほとんどの既知のスタイル ガイドでは、ほとんどの場合に括弧を省略しないように提案しており、一部の例外として省略してもかまいません。

さらに、あなたは 1 つだけで多くのことをしようとしているように感じます。3 項、2 つのpop呼び出し、代入、およびraise. これにより、コードが読みにくく、理解しにくくなり、エラーが発生しやすくなります。この特定の例では、メソッドの先頭でガード句を使用し、三項をまったく削除することをお勧めします。

def plus
  raise(ArgumentError, 'calculator is empty') if @numbers.length < 3

  @numbers << @numbers.pop + @numbers.pop
  # ...

例外の種類も明示的に伝えていることに気付くでしょうArgumentError。問題を最もよく説明しているようです。そして、変数に別の名前を付けます。

各言語には、独自のスタイル、ベスト プラクティス、命名規則、イディオムがあります。これらの規則を理解し、従うことは価値があります。次のようなよく知られた Ruby スタイル ガイドを参照することをお勧めします。

于 2016-11-12T07:50:49.640 に答える
1

に変更raise {"calculator is empty"}raise("calculator is empty")ます。raiseブロックではなく文字列引数を取ることができます。

于 2016-11-12T05:03:12.137 に答える