我有一个生成时间表的简单代码:
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'来自哪里,并且(很可爱)我该如何避免呢?
答案 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
作为输出。