gpt4 book ai didi

ruby - 将此 #to_proc 方法添加到 String 以便能够映射到 Ruby 哈希是否安全?

转载 作者:太空宇宙 更新时间:2023-11-03 17:58:45 27 4
gpt4 key购买 nike

您不能使用 Enumerable#map 从数组的每个元素中查找相同的值使用 &:method_name 快捷方式的散列:

# INVALID:

[{a:'bar', b:'world'}, {a:'baz', b:'boston'}].map &:[:a]

但是您可以通过向 String 添加 #to_proc 方法来解决这个问题。您可以编写这个新的#to_proc 方法,以便您使用将 &"key"传递给枚举器以通过键查找值。

res = [{a:'bar', b:'world'}, {a:'baz', b:'boston'}].map &":a"

puts res.inspect

#=> ["bar", "baz"]

比较你必须写的其他内容:

res = [{a:'bar', b:'world'}, {a:'baz', b:'boston'}].map {|x| x[:a]}

以下是如何修补 String 类以使其工作:

class String
def to_proc
->(x) { x.send :[], (self[0] == ':' ? self[1..-1].to_sym : self) }
end
end

请注意,这将仅使用带有字符串或符号键的散列。

我的问题:就良好的 Ruby 实践而言,这样做安全吗?它是一个相当全局性的变化,但我不知道这可能有任何副作用,并且它可以说会使我的代码在很多地方更加简洁。

最佳答案

不使用哈希,考虑使用 OpenStruct :

require 'ostruct'

a = [
OpenStruct.new(a:'bar', b:'world'),
OpenStruct.new(a:'baz', b:'boston'),
]
p a.map(&:a)
# => ["bar", "baz"]

您必须通过在 OpenStruct 中包装哈希来预先付出代价,但以后的使用会变得更容易,并且不会因修改基类的行为而产生潜在的混杂影响。

如果散列有行为,请考虑将它们设为常规 ol' 类。

关于ruby - 将此 #to_proc 方法添加到 String 以便能够映射到 Ruby 哈希是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8857773/

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