gpt4 book ai didi

ruby - Array() 应用于哈希?

转载 作者:数据小太阳 更新时间:2023-10-29 07:23:06 24 4
gpt4 key购买 nike

最近我偶然发现了“The Elements of Style in Ruby #3: Make Sure Something Is an Array”。

TL;DR:Ruby 中的方法 Array() 将您输入的任何内容转换为数组,并尝试猜测正确的结果应该是什么:

Array(1)     # => [1]
Array([1,2]) # => [1,2]
Array(nil) # => []

那么 Array({a: :b}) 返回什么?我假设它返回一个以散列作为值的数组:[{a: :b}]

然而,hash 被直接转换为数组:[:a, :b]

我不只是想将散列放入数组 ([{a: :b}])。我希望拥有无论我输入什么都返回数组的功能。Array() 已经这样做了,但它以我不期望的方式将散列转换为数组。

所以,基本上功能应该是这样的:

NewFancyArrayMethod({a: :b}) # => [{a: :b}]
NewFancyArrayMethod([{a: :b}, {c: :d}]) # => [{a: :b}, {c: :d}]

第二部分已经由 Array() 完成。

我知道我可以做类似 values = [values] 的事情,除非 values.is_a? Array,就像文章指出的那样。但是,我宁愿有一种方法可以像 Array() 那样从我这里抽象出这种转换。唯一的问题是 Array() 对待散列的方式不同于任何其他“单一”值(字符串、整数、对象等)。我只是不想对不同的情况进行不同的处理。

最佳答案

So what does Array({a: :b}) return? I would assume it returns an array with the hash as a value: [{a: :b}].

你的假设是错误的。 Kernel#Array通过尝试(按该顺序)转换参数 arg:

  1. arg.to_ary
  2. arg.to_a
  3. 最后创建[arg]

示例:

Array(1)        #=> [1]

这是因为 (3)。没有 Fixnum#to_aryFixnum#to_a

Array([1, 2])   #=> [1, 2]

由于 (1),这不会返回 [[1, 2]]Array#to_ary返回 self

Array(nil)      #=> []

由于 (2),这不会返回 [nil]。没有 NilClass#to_ary 但有 NilClass#to_a : “总是返回一个空数组。”

Array({a: :b})  #=> [[:a, :b]]

Array(nil) 这不会返回 [{a: :b}] 因为 (2)。没有 Hash#to_ary 但有 Hash#to_a : “将 hsh 转换为 [key, value] 数组的嵌套数组。”

Array(Time.now) #=> [33, 42, 17, 22, 8, 2013, 4, 234, true, "CEST"]

这是 Time#to_a返回 ... “时间值的十元素数组”

结论:

Kernel#Array 按预期工作,Hash#to_a 是罪魁祸首。 (或一般的 to_a)

I'd like to have a functionality, that returns an array no matter what I put in.

HashArray 是不同的对象。您可以检查类型(Kernel#Array 也这样做):

def hash_to_array(h)
h.is_a?(Array) ? h : [h]
end

或者扩展Hash(甚至Object)和Array:

class Hash # or Object
def my_to_a
[self]
end
end

class Array
def my_to_a
self
end
end

请参阅替代实现的评论。

关于ruby - Array() 应用于哈希?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18381505/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com