什么样的数据类型('a'..'z')?

时间:2013-11-26 23:46:23

标签: ruby

如果我输入('a'..'z').each { |a| puts a},那么数据类型级别到底发生了什么?我知道,当它被打印时,它是单独的字符串,但它本身是'a'..'z'的什么?它是一个阵列吗?

3 个答案:

答案 0 :(得分:6)

这是Range

 ('a'..'z').class
 => Range

您可以将其转换为('a'..'z').to_a的数组。

答案 1 :(得分:3)

这是Range

irb(main):001:0> ('a'..'z').class
=> Range

答案 2 :(得分:0)

要回答问题的第二部分,'a'..'z'Range。像其他人一样说:

('a'..'z').class # => Range

要回答关于数据类型级别发生的问题的第一部分,范围就像数组一样。当您使用字母作为范围端点时,范围包含离散元素,就像数组一样。换句话说,它包含'a''z'的所有字母,包含在内。使用整数时也是如此。 1..5包含12345。与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 }来证明这一点。