额外的" 1"在这个输出来自?

时间:2014-09-08 04:30:29

标签: ruby output

我有一个生成时间表的简单代码:

def times_table(rows)
  columns = rows
  1.upto(rows) do |x|
    1.upto(columns) do |y|
      printf "%5d", x*y
    end
    print "\n"
  end
end

当我尝试将其放在“codetester.rb”文件后跟行puts times_table(4)时,我得到以下结果:

$ ruby codetester.rb 

  1    2    3    4
  2    4    6    8
  3    6    9   12
  4    8   12   16
1

最后的额外'1'来自哪里,并且(很可爱)我该如何避免呢?

1 个答案:

答案 0 :(得分:6)

要在不更改方法正文的情况下解决此问题,请不要调用puts并仅使用:

 times_table(4)

你得到了额外的1,因为你写道:

puts times_table(4)

这表示“打印times_table(4)”的值。其值为“1”,因为times_table(4)的返回值等于:

1.upto(rows) { ... }

upto返回调用它的值。


这是一个更简单,类似的例子,因为OP似乎对返回值的工作原理有点困惑。

假设你有这种方法:

def foo
  puts "hello!"
  100
end

如果你这样做:

foo
然后“你好!”将被打印为调用foo的副作用。不会打印返回值100,因为您没有打印foo本身的值。所以你会看到:

hello!

作为输出。

相比之下,如果你这样做:

puts foo
然后“你好!”将像以前一样打印为调用foo的副作用。但这一次,还会打印返回值,因为您编写了puts foo。所以你会看到:

hello!
100

作为输出。