2012-01-13 30 views
1

不能使用可枚举#地图从每个元素查找相同值的使用& 散列的数组:METHOD_NAME快捷:将此#to_proc方法添加到字符串以便能够映射Ruby哈希值是否安全?

# INVALID: 

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

但是你可以通过添加#to_proc方法解决这个问题字符串。您可以编写这个新的#to_proc方法,以便您使用 向枚举器传递&“键”以通过键查找值。

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实践去做就行了吗?它是 一个相当全球性的变化,但我不知道这可能有任何副作用,它可以使我的代码在很多地方更简洁。

+1

'{| x | x [:a]}':[恐怖,恐怖](http://www.youtube.com/watch?v=aNUr__-VZeQ)。 *简明*和*短*是不同含义的词。 – 2012-01-13 23:20:22

+0

你是否也会说{| x | x.a}也不错,而且带走&:a不会有什么区别? – dan 2012-01-13 23:31:37

+0

我觉得@mu是在说“脸颊上的舌头”。 – 2012-01-14 00:07:22

回答

4

而不是使用哈希的,可以考虑使用OpenStruct

require 'ostruct' 

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

你付出的代价前面具有包裹散列在OpenStruct,但后来使用变得更容易,而且无需修改行为的潜在混杂影响的基类。

如果散列有行为,可以考虑让它们定期排列。

相关问题