如果我输入('a'..'z').each { |a| puts a}
,那么数据类型级别到底发生了什么?我知道,当它被打印时,它是单独的字符串,但它本身是'a'..'z'
的什么?它是一个阵列吗?
答案 0 :(得分:6)
答案 1 :(得分:3)
这是Range:
irb(main):001:0> ('a'..'z').class
=> Range
答案 2 :(得分:0)
要回答问题的第二部分,'a'..'z'
是Range
。像其他人一样说:
('a'..'z').class # => Range
要回答关于数据类型级别发生的问题的第一部分,范围就像数组一样。当您使用字母作为范围端点时,范围包含离散元素,就像数组一样。换句话说,它包含'a'
到'z'
的所有字母,包含在内。使用整数时也是如此。 1..5
包含1
,2
,3
,4
和5
。与Array
class一样,Range
包含Enumerable
module,因此它包含许多方法,例如each
。在您的示例中,each
正在迭代您的范围成员。
范围在几个重要方面与数组不同。
首先,您可以使用Float
值作为端点。例如,1.1..5
是有效范围:
(1.1..5).class # => Range
当你尝试迭代这样的范围时,会引发错误:
(1.1..5).each { |a| puts a } # => TypeError: can't iterate from Float
这是因为该范围的元素不是离散的。范围是连续的。
范围也与数组不同,因为您可以使用...
而不是..
以排除第二个端点的方式定义它们。例如,'a'...'z'
包含字母'a'到'y'。 'z'不在此范围内。您可以尝试('a'...'z').each { |a| puts a }
来证明这一点。