shovel(<<)运算符在Ruby Hashes中如何工作? [英] How does shovel (<<) operator work in Ruby Hashes?

查看:92
本文介绍了shovel(<<)运算符在Ruby Hashes中如何工作?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在阅读 Ruby Koans教程系列,当我在 about_hashes.rb

  def test_default_value_is_the_same_object 
hash = Hash.new([])

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

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

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

assert_equals 中的值实际上是预期的教程。但我无法理解如何使用<< = 运算符? p>

我的期望是:


  • hash [:one ] 会是 [uno]

  • hash [:two] 会是 [dos]

  • hash [:three] 会是 []



为什么我的期望是错的?

解决方案

当你在做 hash = Hash.new([] )您正在创建一个Hash,其默认值与所有键完全相同的Array实例。所以,当你访问一个不存在的键时,你会得到相同的数组。

  h = Hash.new ([])
h [:foo] .object_id#=> 12215540
h [:bar] .object_id#=> 12215540

如果你想为每个键一个数组,你必须使用 Hash.new

  h = Hash.new {| h,k | h [k] = []} 
h [:foo] .object_id#=> 7791280
h [:bar] .object_id#=> 7790760

编辑:另请参阅Gazler关于#<< 方法以及您实际调用它的对象。


I was going through Ruby Koans tutorial series, when I came upon this in about_hashes.rb:

def test_default_value_is_the_same_object
  hash = Hash.new([])

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

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

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

The values in assert_equals, is actually what the tutorial expected. But I couldn't understand how there is a difference between using << operator and = operator?

My expectation was that:

  • hash[:one] would be ["uno"]
  • hash[:two] would be ["dos"]
  • hash[:three] would be []

Can someone please explain why my expectation was wrong?

解决方案

When you're doing hash = Hash.new([]) you are creating a Hash whose default value is the exact same Array instance for all keys. So whenever you are accessing a key that doesn't exist, you get back the very same Array.

h = Hash.new([])
h[:foo].object_id # => 12215540
h[:bar].object_id # => 12215540

If you want one array per key, you have to use the block syntax of Hash.new:

h = Hash.new { |h, k| h[k] = [] }
h[:foo].object_id # => 7791280
h[:bar].object_id # => 7790760

Edit: Also see what Gazler has to say with regard to the #<< method and on what object you are actually calling it.

这篇关于shovel(&lt;&lt;)运算符在Ruby Hashes中如何工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆