这是Ruby Enumerable的错误吗?

时间:2015-01-07 00:18:20

标签: ruby-on-rails ruby rails-console

来自Ruby Enumerable查找方法:

  

将枚举中的每个条目传递给阻止。返回第一个块不为false的块。

使用有序哈希(对我来说),这会爆发:

(Rails 4.0.3)
> myhash = { 1 => [ {:a=>1, :b=>2}, { :a=>"cats", :b=> "dogs"} ] }
  => {1=>[{:a=>1, :b=>2}, {:a=>"cats", :b=>"dogs"}]} 
> fleh = myhash[1]
  => [{:a=>1, :b=>2}, {:a=>"cats", :b=>"dogs"}] 

好的,我想要带有“猫”的元素:

2.1.1 :003 > char = fleh.find{ |cur| cur[:a] = "cats" }
=> {:a=>"cats", :b=>2} 

什?这看起来很有趣。让我们再试一次。让我们复制一下myhash:

> myhash = { 1 => [ {:a=>1, :b=>2}, { :a=>"cats", :b=> "dogs"} ] }
  => {1=>[{:a=>1, :b=>2}, {:a=>"cats", :b=>"dogs"}]} 
> clone = myhash.clone
  => {1=>[{:a=>1, :b=>2}, {:a=>"cats", :b=>"dogs"}]} 

好的,让我们看看会发生什么:

> fleh = clone[1]
  => [{:a=>1, :b=>2}, {:a=>"cats", :b=>"dogs"}] 
> num = fleh.find { |cur| cur[:a] = "cats" }
  => {:a=>"cats", :b=>2} 

当然是一样的。我的收藏怎么样?

> clone
  => {1=>[{:a=>"cats", :b=>2}, {:a=>"cats", :b=>"dogs"}]} 

现在有些奇怪了。它写了我的{:a => 1}!让我们看看我的原始对象:

> myhash
  => {1=>[{:a=>"cats", :b=>2}, {:a=>"cats", :b=>"dogs"}]}    

这令人不安。不仅没有找到我认为的那样(返回具有“猫”属性的'cur'的第一个实例,它在集合上写了,并且不知何故,它写了对象 It Was Cloned From < / em>的

有人能够重复这个吗?这在rails控制台中有些奇怪吗?如您所见,这是运行Ruby 2.1.1的Rails 4.0.3

1 个答案:

答案 0 :(得分:4)

好的,这里没什么可看的。请继续前进。 。 。 捂脸 没有错误或任何东西。我分配该值。我需要做一个比较!!

num = fleh.find { |cur| cur[:a] == "cats" }

注意&#34; ==&#34;

我们得到:

=> {:a=>"cats", :b=>"dogs"}