为啥 Ruby 象征着我的哈希键?
Posted
技术标签:
【中文标题】为啥 Ruby 象征着我的哈希键?【英文标题】:Why is Ruby symbolising my hash keys?为什么 Ruby 象征着我的哈希键? 【发布时间】:2016-10-23 00:48:34 【问题描述】:我在编写 Ruby 模块(Sinatra 应用程序的一组辅助方法)时遇到了一些奇怪的事情。我将哈希声明为常量,键为字符串。后来,当我尝试检索一个值时,我得到了 nil。在检查哈希时,我发现键已转换为符号。怎么回事?
这是一个简化的例子:
module HelperModule
RANGES =
'a' => 1...60,
'b' => 60...90,
'c' => 90..999
.freeze
def find_range(key)
RANGES[key] # Returns nil when key is 'a', 'b' or 'c'
end
end
检查范围产量::a=>[1...60], :b=>[60...90], :c=>[90..999]
。
我可以通过转换密钥.to_sym
轻松解决它,但我想了解这里发生了什么。
【问题讨论】:
无法重现该问题。我可以通过字符串键正常访问值。 感谢您的尝试。如果它是一个 Rails 项目,我会这样指责,但这是一个非常简单的应用程序,没有很多库代码,可能会做这样的愚蠢事情。必须是特定于项目的东西 - 我也无法在irb
中重现它......
你的Hash.ancestors
里面有什么(在相同的环境下,find_range
里面的puts RANGES.class.ancestors.inspect
应该有帮助)?
宾果游戏,@Vasfed - 祖先是 "[Hash, JSON::Ext::Generator::GeneratorMethods::Hash, Enumerable, Object, PP::ObjectMixin, JSON::Ext::Generator::GeneratorMethods::Object, Kernel, BasicObject]"
,其中 irb
中的普通哈希只有 "[Hash, Enumerable, Object, Kernel, BasicObject]"
看起来像是其中一个 JSON 库以某种方式参与其中。如果您将评论作为答案,我会接受。这是一个我不知道的有用工具。
那些投反对票的人:愿意详细说明吗?这个问题完全有效,答案对其他人有用。
【参考方案1】:
你的环境中的某些东西会改变Hash
。
从查看RANGES.class.ancestors
开始,同时寻找改进(那些你可能必须用grep 查找using
)
【讨论】:
以上是关于为啥 Ruby 象征着我的哈希键?的主要内容,如果未能解决你的问题,请参考以下文章