为什么Ruby代表我的哈希键?

为什么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

在编写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]}


通过将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中的一个不知何故参与进来了。如果你的评论是我的答案,我会接受。这是一个我不知道的有用工具。那些被否决的人:想详细说明吗?这个问题完全正确,答案对其他人有用。