为什么Ruby代表我的哈希键?
在编写Ruby模块(Sinatra应用程序的一组辅助方法)时,我遇到了一些奇怪的事情。我将散列声明为常量,将键声明为字符串。稍后,当我尝试检索一个值时,我得到nil。检查散列后,我发现键已转换为符号。发生什么事了 下面是一个简化的示例:为什么Ruby代表我的哈希键?,ruby,hash,symbols,Ruby,Hash,Symbols,在编写Ruby模块(Sinatra应用程序的一组辅助方法)时,我遇到了一些奇怪的事情。我将散列声明为常量,将键声明为字符串。稍后,当我尝试检索一个值时,我得到nil。检查散列后,我发现键已转换为符号。发生什么事了 下面是一个简化的示例: module HelperModule RANGES = { 'a' => 1...60, 'b' => 60...90, 'c' => 90..999 }.freeze def find_range(k
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]}
通过将key
转换为_-sym
,我可以很容易地解决这个问题,但我想了解这里发生了什么。这是您的环境中改变了散列的东西
从查看范围.类.祖先开始
,同时也要寻找改进(那些您可能必须使用的改进)无法重现问题。我可以通过字符串键正常访问值。谢谢尝试。如果它是一个Rails项目,我会用这种方式指责它,但这是一个非常简单的应用程序,没有很多库代码,可能会做这样愚蠢的事情。但是必须是特定于项目的东西-我也不能在irb
中复制它…你的散列中的内容。祖先
(在相同的环境中,放置RANGES.class.祖先。检查内部查找范围
应该有帮助)?宾果,@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 LIB中的一个不知何故参与进来了。如果你的评论是我的答案,我会接受。这是一个我不知道的有用工具。那些被否决的人:想详细说明吗?这个问题完全正确,答案对其他人有用。