2016-03-29 11 views
0
require 'csv' 

i = 0 
CSV.foreach("survdata.csv", headers: true) do |row| 
    puts row 
    i++ 
    if i > 1 then 
    break 
    end 
end 

これはとてもシンプルに見えますが、まだそれは実行されません。あなたはなぜ私が得ているか見ることができます:Rubyのbreak式奇妙な

/mydev/surveyresult/surveyresult.rb:11: void value expression 

ありがとう!

+1

FWIW:ルビには '++'演算子はありません:http://stackoverflow.com/questions/3717519/no-increment-operator-in-ruby – orde

+0

@ ordeそれは関連していますが、その理由ではありません。 – sawa

+0

ああ、私の顔は赤いです!ありがとう@スタックオーバーフロー! (私は過去3ヶ月間Javaを教えていました。私のルビー精神データベースは壊れていました!!!) – pitosalas

答えて

1

Rubyがi+=1へのショートカットとしてi++構文をサポートしていないん

i++ 

の代わりに

。理由の詳細については、Why doesn't Ruby support i++ or i-- (increment/decrement operators)?を参照してください。

あなたは、このようにコードを修正することができます:エラーメッセージ(感謝沢)の

require 'csv' 

i = 0 
CSV.foreach("survdata.csv", headers: true) do |row| 
    puts row 
    i = i+1 
    if i > 1 then 
    break 
    end 
end 

詳細情報:Rubyは、実際にi++構文をサポートしていない

。それはxが続いている場合、それは、その結果i+に引数として渡さxに適用単項演算子+、と解釈されます。あなたの例では、if i > 1 then; break; endは、エラーメッセージ「無効値式」、したがって、任意の値を返しません。

+2

厳密に言えば、あなたの答えは間違っています。 Rubyがそのような構文を構文的にサポートしていない場合、構文エラーが発生しますが、Rubyはそうしません。 'i ++'構文をサポートしています。それに 'x'が続く場​​合、' x'に適用される単項演算子 '+'として解釈され、結果は 'i +'への引数として渡されます。 – sawa

+0

公正な厳密な点。しかし、ここには「x」はありませんでした。作者が期待したとおりに動作しないと言うことに同意できますか? – babgyy

+0

この場合、 'x'は' if i> 1です。ブレーク;終わり。さらに、これはなぜOPが「空値表現」を得ているのかという疑問に答えるものではありません。あなたの答えの行に沿って、なぜそれが構文エラーを起こさなかったのか答えることができますか? – sawa

0

はい。

if i > 1 then 
    break 
end 

部分区切りで、戻り値(問題のコードブロック内)がないためです。そして、あなたは値を持たない何かに単項演算子[email protected]を適用することはできません、またi.+引数などの戻り値を取ることができます。

+1

なぜこれが投票されたのですか?受け入れられた答えにはっきりした説明がありますが、これも正しいです。 – xuuso

1

Rubyはインクリメント演算子に私が最後に見た時間がありません。

i += 1