数字的放置和时间方法

时间:2016-09-14 20:12:05

标签: ruby

此代码:

puts 1.times { puts 2.times { puts 3.times { puts 4 } } }

输出:

4 4 4 3 4 4 4 3 2 1

我希望Ruby能够输出times方法的返回值,但似乎并没有这样做。它打印出要调用times的数字。发生了什么事?

3 个答案:

答案 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并返回nilputs始终返回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