2016-04-20 5 views
0

Was ich zeigen werde, ist eine umfangreiche Funktion, aber es ist nur, um mein Problem auf einfache Weise zu erklären. Wenn ich das Problem in dieser Funktion löse, habe ich das Problem auch im Originalcode gelöst.Bereich ist am Ende der "jeder" Iteration gedruckt

Das Problem ist einfach, und wahrscheinlich auch die Lösung, aber ich bin neu in Ruby und habe diesen Zweifel. Ich mag die Werte in einem Bereich drucken:

def test 
    (0...5).each do |i| 
    puts i 
    end 
end 

Wenn ich rufe Sie die Funktion, das Ergebnis, das ich will, ist

0 
1 
2 
3 
4 

aber das Ergebnis, das ich habe, ist

0 
1 
2 
3 
4 
0...5 

Warum wird 0...5 zusammen gedruckt? Wie kann ich das vermeiden?

Antwort

4

ich glaube nicht, dass die 0..5 als Teil der puts Aufruf produziert wird. Wenn Sie dies in Ihrer REPL (IRB, PRY, Rails-Konsole usw.) aufrufen, sehen Sie, dass es der letzte zurückgegebene Wert in Ihrem Code ist.

Lassen Sie mich Ihnen ein Beispiel zeigen.

sagen, dass ich eine Datei speichern test.rb mit folgendem Inhalt:

1.upto(5).each { |i| puts i } 

Wenn ich ruby test.rb nennen, sehe ich die erwartete Ausgabe,

0 
1 
2 
3 
4 

Wenn ich irb öffnen und require("./test.rb") laufen, ich sehen Sie die gleiche Ausgabe.

Nur wenn ich den Code in irb einfügen, sehe ich den zusätzlichen Ausgang (=> 0...5). Also würde ich das einfach ignorieren. ausgeführt

+0

Ich habe hier nicht das gleiche Verhalten. Wenn ich nur meine Schleife in einer rb-Datei speichern möchte, habe ich die gewünschte Ausgabe. Aber wenn ich sie in eine Funktion setze, wird der Bereich erneut gedruckt. Wenn ich '' ruby ​​test.rb'' in meinem Linux-Terminal anrufe. – rwehresmann

+0

Ich habe das gerade getestet. Putting 'def foo; 1upto (5) .each {| i | setzt i}; Ende; foo' in einer Datei und das Aufrufen von 'ruby test.rb' gibt nur die Zahlen 1 bis 5 aus. Der Hauptpunkt, den ich versuche zu machen, ist, dass Sie in einer REPL (wie IRB) das Ergebnis von' puts sehen/print' ruft zusätzlich zu den zurückgegebenen Werten jeder Funktion auf. –

2

Neben @Max's answer

Jedes Mal, wenn jeder Ausdruck in IRB Sitzungen ausgeführt wird, wird es auch den Wert von jedem Ausdruck zurückgegeben drucken.

Im Falle einer Methodendefinition wird method_name zurückgegeben.

> def my_method 
?> puts 'this is my method' 
?> end 
=> :my_method 

Sie sehen, ist die :my_method

gedruckt

Wenn das Verfahren aufgerufen wird, sollte der Wert durch das Verfahren der Ausführung dh Reaktion des letzten Ausdrucks in dem Verfahren, das heißt puts

> my_method 
this is my method 
=> nil 
zurück gedruckt

aber es gedruckt nil weil putsalways returnsnil. Ich erwähnte das, weil normalerweise Entwickler erstaunt sind, wenn sie sehen, dass ihre Methoden unerwartet nil zurückgeben.

Verwandte Themen