ruby - 为什么将字符串铲入哈希会导致此结果?

标签 ruby

<分区>

我正在研究 Ruby Koans,以便更好地掌握 Ruby 和 TDD。我到达了 about_hashes.rb 中代码的第 93 行,这让我感到困惑,它如何被铲到默认构造函数而不是散列值中。出于好奇,我尝试使用与字符串相同的东西作为构造函数的参数,它产生了类似的结果。

现在我的问题是,为什么无论我使用什么键,都会检索到相同的对象,以及我如何将新对象铲到方法中散列中特定键的数组中 test_default_value_is_the_same_object?

def test_default_value_is_the_same_object
    hash = Hash.new([])

    hash[:one] << "uno"
    hash[:two] << "dos"

    assert_equal ["uno", "dos"], hash[:one] #why not ["uno"]?
    assert_equal ["uno", "dos"], hash[:two] #why not ["dos"]?
    assert_equal ["uno", "dos"], hash[:three] #why not []?

    assert_equal true, hash[:one].object_id == hash[:two].object_id
  end

def test_default_value_with_block
    hash = Hash.new {|hash, key| hash[key] = [] }

    hash[:one] << "uno"
    hash[:two] << "dos"

    assert_equal ["uno"], hash[:one]
    assert_equal ["dos"], hash[:two]
    assert_equal [], hash[:three]
end

最佳答案

关于原因的提示在测试的名称中。

test_default_value_is_the_same_object 是为了向您展示,当您请求 hash[:some_value_that_doesnt_exist_yet] 时,默认情况下,您会取回您指定的默认值 -- 这是每次都是相同的对象。通过修改该对象,您可以为每个不存在的键修改它。修改 hash[:one] 也会修改 hash[:two]

test_default_value_with_block 显示了使用 block 构建哈希,该 block 将用于为每个键提供新值。当您这样做时,hash[:one]hash[:two] 的值是不同的。

关于ruby - 为什么将字符串铲入哈希会导致此结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46697281/

相关文章:

ruby-on-rails - 如何在 Rails 中添加返回 "variables"的方法?

ruby - 获取 MongoDB 中列的最高值

ruby-on-rails - 如何将独立的 Rack 应用程序安装到 Ruby On Rails 应用程序中?

ruby-on-rails - Ruby on Rails I18n 插值

Ruby:如何获取与条件匹配的前 x 数组元素的索引?

ruby - 使用和不使用 Rails 的快速 (Rspec) 测试

ruby-on-rails - 在 Linux 机器上为 Rails 项目安装 Postgres 的技巧

ruby - 在没有 'instance' 引用的情况下调用 Ruby Singleton 的方法

ruby-on-rails - 如何在 Windows 10 上安装 rmagick

ruby-on-rails - 如何从模型的类方法访问 UrlWriter url/路径生成器?