2016-04-20 7 views
0

私が示しているのは、洗練された機能ですが、問題を簡単な方法で説明するだけです。この関数で問題を解決すると、元のコードの問題も解決しました。"each"イタレーションの最後に範囲が表示されます

問題はシンプルで、たぶん解決策ですが、私はRubyの新機能であり、この疑いがあります。私は、範囲内の値を印刷したい:私は関数を呼び出すとき

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

、私が欲しい結果が

0 
1 
2 
3 
4 

ですが、私が持っている結果が

0 
1 
2 
3 
4 
0...5 

ですなぜこの0...5が一緒に印刷されるのですか?どうすればそれを避けることができますか?

答えて

4

0..5は、putsコールの一部として生成されているとは思われません。むしろREPL(irb、pry、rails consoleなど)でこれを呼び出すと、コード内で最後に返された値であるため、表示されます。

例を示しましょう。私はIRB開き、require("./test.rb")を実行した場合、私は、

0 
1 
2 
3 
4 

、私はruby test.rbを呼び出す場合

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

は、私が期待される出力を参照してください。

は、私は以下の内容を test.rbと呼ばれるファイルを保存すると言います同じ出力を参照してください。

irbにコードを貼り付けて、追加の出力(=> 0...5)が表示されるときだけです。だから私はこれを無視するだけです。任意の式がIRBセッションで実行されるたびに

+0

私はここで同じ動作をしていません。私のループだけをrbファイルに保存すると、あなたの望む出力が得られます。しかし、それらを関数の中に入れると、範囲が再び出力されます。それは私のLinux端末で '' ruby​​ test.rb''と呼ぶときです。 – rwehresmann

+0

私はそれをテストしました。 'def foo 'を置く。 1upto(5).each {| i |私を入れます。終わり; foo'をファイルに書き、 'ruby test.rb'でそれを呼び出すと、1から5の番号が出力されます。私が作ろうとしている主な点は、REPL(IRBのような)では、' puts/print'の呼び出しに加えて、すべての関数の戻り値が含まれています。 –

2

@Max's answer

に加えて、それはまた、実行すべての式から返された値を出力します。

メソッド定義の場合は、定義済みのmethod_nameが返されます。あなたが見

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

:my_methodは、メソッドが呼び出されると、それはputs

> my_method 
this is my method 
=> nil 
すなわち方法の最後の式の応答すなわちメソッドの実行で返された値を印刷する必要があります

を印刷しています

ですが、putsalways returnsnilのようにnilが印刷されています。通常、開発者は予期せずnilを返すメソッドを見て驚いているので、これについて言及しました。