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

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

Das sieht so einfach aus, und doch läuft es nicht. Können Sie verstehen, warum ich erhalte:Ruby Pause Ausdruck wirkt komisch

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

Dank!

+1

FWIW: Es gibt keinen '++' Operator in Ruby: http://stackoverflow.com/questions/3717519/no-increment-operator-in-ruby – orde

+0

@Orde Das ist verwandt, aber ist nicht der Grund. – sawa

+0

Oh ist mein Gesicht rot! Danke @stackoverflow! (Ich habe Java die letzten 3 Monate unterrichtet und meine Ruby mentale Datenbank wurde beschädigt !!!) – pitosalas

Antwort

1

Rubin nicht i++ Syntax als Verknüpfung zu i+=1 unterstützt. Weitere Informationen finden Sie unter "Why doesn't Ruby support i++ or i-- (increment/decrement operators)?".

Sie können Ihren Code wie folgt beheben:

require 'csv' 

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

Weitere Informationen zu der Fehlermeldung (dank Sawa):

Rubin unterstützt tatsächlich i++ Syntax. Wenn es von x gefolgt wird, wird es als unärer Operator + interpretiert, der auf x angewendet wird, dessen Ergebnis als Argument an i+ übergeben wurde. In Ihrem Beispiel gibt if i > 1 then; break; end keinen Wert zurück, daher die Fehlermeldung "void value expression".

+2

Um streng zu sein, ist deine Antwort falsch. Wenn Ruby ein solches Konstrukt nicht syntaktisch unterstützt, würde dies einen Syntaxfehler verursachen, tut es aber nicht. Es unterstützt die 'i ++' Syntax. Wenn "x" folgt, wird es als unärer Operator "+" interpretiert, der auf "x" angewendet wird, dessen Ergebnis als Argument an "i +" übergeben wird. – sawa

+0

Fairer strikter Punkt. Allerdings gab es hier kein 'x', können wir zustimmen zu sagen, dass es nicht wie vom Autor erwartet funktionieren wird? – babgyy

+0

'x' in diesem Fall ist' wenn i> 1 dann; Unterbrechung; Ende. Darüber hinaus beantwortet dies nicht die Frage, warum das OP "ungültigen Wertausdruck" erhält. Können Sie, Ihrer Antwort folgend, beantworten, warum es keinen Syntaxfehler verursacht hat? – sawa

0

Ja. Es ist, weil die:

if i > 1 then 
    break 
end 

Teil bricht, die (innerhalb des Codeblocks in Frage) keinen Rückgabewert haben. Und Sie können den unären Operator [email protected] nicht auf etwas anwenden, dem ein Wert fehlt, noch kann i.+ den Rückgabewert eines Arguments annehmen.

+1

Warum wurde das abgelehnt? Trotz der akzeptierten Antwort hat eine klarere Erklärung diese auch richtig. – xuuso

1

Ruby hat beim letzten Mal keinen Inkrementoperator.

Anstelle von

i++ 

tun

i += 1