2015-02-10 73 views
1

我是Ruby新手。 我发现这个代码,同时阅读教程这个输出是如何实现的?

10.times { |i | print i, " " } # o/p => 0 1 2 3 4 5 6 7 8 9 

我知道次重复的次数行为的数目,它被称为。 我假设我被初始化为0. 但是,它是如何递增的?

+1

'times'方法进行递增。 'times'是整数对象的一种方法,在这里是'10',它接受一个块作为参数('{...}'部分),它在一个循环内执行。 – lurker 2015-02-10 10:48:47

+0

感谢您的回复。但是,我需要另一个澄清。如果times是一个整数对象,并且每次都会增加3.times {puts“Hi!”}。打印嗨!嗨!喜? – Rocky29 2015-02-10 10:50:16

+1

为什么不检查'时间'方法来源: http://www.ruby-doc.org/core-2.2.0/Integer.html#method-i-times – 2015-02-10 10:51:34

回答

2

我假设我被初始化为0.但是,它是如何递增的?

有一个内部变量,整数本身不会改变。让我们使用基本while循环实现我们自己的times方法:

class Integer 
    def my_times 
    i = 0   # initialize to 0 
    while i < self # self is the integer object, i.e. 10 
     yield i  # pass i to the block 
     i += 1   # increment i 
    end 
    end 
end 

用法:

10.my_times { |i| print i, " " } #=> 0 1 2 3 4 5 6 7 8 9 

Ruby的方法比较复杂(返回无块一个枚举),但你的想法。

2

times创建递增的数字的阵列(以及一个枚举实际上,但是它可以被转换为与to_a阵列)

$ irb 
irb(main):001:0> 3.times.to_a 
=> [0, 1, 2] 
irb(main):002:0> 10.times.to_a 
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

参见:http://www.ruby-doc.org/core-2.2.0/Integer.html#method-i-times

each是Array /枚举方法,该方法每个元素均为yields

请参见:
http://www.ruby-doc.org/core-2.2.0/Array.html#method-i-each
http://www.ruby-doc.org/core-2.0.0/Enumerator.html#method-i-each

+1

Nitpicking,但它不创建数组('to_a'),它只是将每个数字传递给块。只有在没有给出块的情况下才返回枚举器。 – Stefan 2015-02-10 11:37:34

1

在Ruby中,一切都是对象,包括数字。整数是对象,也就是说,它们是从包含方法的Integer类定义的。这些方法可以在对象的实例上调用。因此,数字10整数类的实例对象,您可以调用它的方法。

其中一种方法是。当你这样做:

10.times ... 

您的对象10上调用times方法。该方法接受一个块参数{...}

10.times { |i| puts i } 

这里,i对于参数并在内部的times方法具有将运行参数从0到您呼叫的倍对象整数的环方法。

正如@MarekLipka在评论中所说,请参阅Ruby Integer类的文档。