为啥 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 象征着我的哈希键?的主要内容,如果未能解决你的问题,请参考以下文章

为啥哈希中的这个字符串键被转换为符号?

汇总所有相似哈希键的值 Ruby

哈希键的Ruby值?

为啥哈希表键通常被认为是无序的?

如何将带有对象作为键的 Ruby 哈希对象作为 Map 对象发送到前端 Javascript

使用类常量作为 Ruby 哈希键