数组方法不一致的行为

时间:2017-03-21 19:22:47

标签: arrays ruby

我遇到了奇怪的Array方法行为,我想知道是否有任何理由呢?对我来说,它看起来像Ruby中的一个错误:

Array(1)
[1]
Array('')
[""]
Array({})
[] # ???
Array(nil)
[] # ???

当我将nil{}传递给Array时,我希望得到一个包含一个元素的数组,相反,我得到一个空数组。请注意,当我传递一个空字符串时,它正确(在我看来)返回一个包含一个元素的数组。谁能解释这种行为背后的逻辑?

我期待:

Array(nil) # => [nil]
Array({})  # => [{}]

与以下内容一致:

Array('')  # => ['']

或者另一种合理的行为是:

Array('')  # => []

这将是'一致'用:

Array(nil) # => []
Array({})  # => []

2 个答案:

答案 0 :(得分:5)

对于哈希,行为是明确定义的:哈希被分解为键/值对,每对都在“子” - 阵列中。空哈希没有键/值对,所以它是一个空数组。没有其他意义;一个空物体的特殊外壳会打破最不可能的原则。

对于nil你可以争论任何一种方式。由于nil不是IMO,因此空数组是有意义的。

最终答案是因为那是.to_ary.to_a的回归。对于nil,我会发现一个空数组nil - y比其中包含单个nil的数组更多。对于哈希,我认为它必须与非空哈希转换为数组的方式一致。

答案 1 :(得分:2)

函数Array(x)尝试使用以下逻辑将x转换为数组:

  1. 尝试使用x.to_ary
  2. 隐式转换它
  3. 尝试使用x.to_a
  4. 显式转换它
  5. 通过将其包装在数组中来转换它,即[x]
  6. 因此,单个对象决定了它们如何转换为数组的逻辑。 Array('') ['']而不是[]的原因是字符串没有to_aryto_a方法,因为ruby 1.9。我相信这个改变是因为没有规范的方法将字符串转换为数组。你想要按字符分割吗?等