此代码:
puts 1.times { puts 2.times { puts 3.times { puts 4 } } }
输出:
4 4 4 3 4 4 4 3 2 1
我希望Ruby能够输出times
方法的返回值,但似乎并没有这样做。它打印出要调用times
的数字。发生了什么事?
答案 0 :(得分:7)
你在一个循环中有一个(准)循环,所以Ruby正在做你正在问的问题。一般来说,评估这些循环的方式是由内而外。
times
的返回值是首先给出的数字,因此3.times
会返回3
。
考虑到所有这些,你可以解释发生了什么:
4 # First iteration of 3.times { puts 4 }
4
4
3 # Return value of 3.times displayed
4 # Second iteration of 3.times { puts 4 }
4
4
3 # Return value of 3.times displayed
2 # Return value of 2.times displayed
1 # Return value of 1.times displayed
现在当我看到像puts 3.times
这样的代码通常是一个错误时,同样适用于puts array.each ...
,其中某人可能意味着.map
。
答案 1 :(得分:3)
我也没有真正得到那个输出,所以让我们从最里面的表达开始剖析它:
puts 4
# 4 <- this should denote output
#=> nil <- this should denote return value
打印4
并返回nil
(puts
始终返回nil
)。
将其包裹在3.times { ... }
中打印4
3次:
3.times { puts 4 }
# 4
# 4
# 4
#=> 3
但不是返回nil
,而是返回3
。这是因为times
总是返回接收者(即你调用times
的整数)。
现在让我们添加另一个puts
:
puts 3.times { puts 4 }
# 4
# 4
# 4
# 3
#=> nil
与上述相同,但也打印3.times { ... }
的结果,即3
。
将所有内容都包含在2.times { ... }
中,重复上述输出:
2.times { puts 3.times { puts 4 } }
# 4
# 4
# 4
# 3
# 4
# 4
# 4
# 3
#=> 2
由于2
,它还会返回nil
而不是2.times { ... }
。
添加puts
打印2
:
puts 2.times { puts 3.times { puts 4 } }
# 4
# 4
# 4
# 3
# 4
# 4
# 4
# 3
# 2
#=> nil
在1.times { ... }
中包含此内容会产生相同的输出,但会将结果从nil
更改为1
:
1.times { puts 2.times { puts 3.times { puts 4 } } }
# 4
# 4
# 4
# 3
# 4
# 4
# 4
# 3
# 2
#=> 1
添加puts
的最后1
次打印:
puts 1.times { puts 2.times { puts 3.times { puts 4 } } }
# 4
# 4
# 4
# 3
# 4
# 4
# 4
# 3
# 2
# 1
#=> nil
答案 2 :(得分:2)
我想我希望Ruby能够输出
times
方法的返回值,但似乎并没有这样做。它打印出正在调用times
的数字。
That is the return value of the times
method:
times {|i| block }
→self