在Ruby中用HashWithIndifferentAccess完全替换Hash不好吗?
Is it bad to completely replace Hash with HashWithIndifferentAccess in Ruby?
我发现自己经常 运行 遇到错误,在这些错误中我使用符号而不是字符串访问哈希,反之亦然。我想做:
require 'active_support/hash_with_indifferent_access'
Hash = HashWithIndifferentAccess
# (irb):xx: warning: already initialized constant Hash
这个警告是因为 Hash 已经被定义了,但我并不关心。
当然,性能可能会稍差。
当然,也许有些人 gem 使用字符串和符号创建一个散列并且会破坏 -- 但这种情况有多常见?
这很糟糕吗?反模式?我会后悔这样做吗?缺点是什么? good/bad 有这样做的经历吗?
你认为 {}.class
在你的拼杀之后会是什么?对,就是Hash
.
你认为Hash[:a, 'a']
会做什么?是的,SystemStackError
出于明显的原因。
所以是的,这是个坏主意,你会后悔的,一个重要的缺点是它实际上并没有按照你的想法去做。
最大的缺点是您使哈希函数变为 O(n) 而不是 O(1)。比较字符串比比较符号要求更高,所以我认为这会严重影响性能。
你不应该 运行 在访问带有符号的哈希时遇到错误,因为它们与字符串非常相似,也许阅读这篇文章会有所帮助:Differences between symbols and strings
我发现自己经常 运行 遇到错误,在这些错误中我使用符号而不是字符串访问哈希,反之亦然。我想做:
require 'active_support/hash_with_indifferent_access'
Hash = HashWithIndifferentAccess
# (irb):xx: warning: already initialized constant Hash
这个警告是因为 Hash 已经被定义了,但我并不关心。
当然,性能可能会稍差。
当然,也许有些人 gem 使用字符串和符号创建一个散列并且会破坏 -- 但这种情况有多常见?
这很糟糕吗?反模式?我会后悔这样做吗?缺点是什么? good/bad 有这样做的经历吗?
你认为 {}.class
在你的拼杀之后会是什么?对,就是Hash
.
你认为Hash[:a, 'a']
会做什么?是的,SystemStackError
出于明显的原因。
所以是的,这是个坏主意,你会后悔的,一个重要的缺点是它实际上并没有按照你的想法去做。
最大的缺点是您使哈希函数变为 O(n) 而不是 O(1)。比较字符串比比较符号要求更高,所以我认为这会严重影响性能。
你不应该 运行 在访问带有符号的哈希时遇到错误,因为它们与字符串非常相似,也许阅读这篇文章会有所帮助:Differences between symbols and strings