范围在“每次”迭代结束时打印

时间:2016-04-20 02:16:09

标签: ruby

我将展示的是一个充满乐趣的功能,但它只是以简单的方式解释我的问题。如果我在这个函数中解决了问题,我也解决了原代码中的问题。

问题很简单,可能也是解决方案,但我是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一起打印?我怎么能避免这种情况?

2 个答案:

答案 0 :(得分:4)

我不认为0..5puts调用的一部分。相反,当你在REPL(irb,pry,rails console等)中调用它时,你会看到它,因为它是代码中最后返回的值。

让我举个例子。

假设我保存了一个名为test.rb的文件,其中包含以下内容:

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

如果我拨打ruby test.rb,我会看到预期的输出

0
1
2
3
4

如果我打开irb并运行require("./test.rb"),我会看到相同的输出。

只有当我将代码粘贴到irb中时,才能看到附加输出(=> 0...5)。所以我会忽略这一点。

答案 1 :(得分:2)

除了@Max's answer

每当在IRB个会话中执行任何表达式时,它也会打印每个执行的表达式返回的值。

在方法定义的情况下,它返回刚刚定义的method_name

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

您看,:my_method已打印

当调用方法时,它应该打印方法执行返回的值,即方法中最后一个表达式的响应,即puts

  > my_method
this is my method
 => nil 

但它打印nil,因为puts always returns nil。我之所以提到这一点,是因为通常开发人员在看到他们的方法意外返回nil时会感到惊讶。