【问题标题】:Is this a bug with Ruby Enumberable? [closed]这是 Ruby Enumerable 的错误吗? [关闭]
【发布时间】:2015-03-04 18:16:46
【问题描述】:

来自Ruby Enumerable的查找方法:

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

使用有序哈希(对我而言),这会爆炸:

(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"}]}    

这令人不安。不仅发现不是我想的那样(返回具有“cats”属性的“cur”的第一个实例,它覆盖了集合,并且不知何故,它写了对象它是克隆自

有人可以复制吗?这是rails控制台中的一些奇怪之处吗?如您所见,这是运行 Ruby 2.1.1 的 Rails 4.0.3

【问题讨论】:

  • fleh.find { |cur| cur[:a] = "cats" } 中,您使用的是赋值运算符 (=) 而不是比较运算符 (==)。
  • 刚刚抓住它。这很可悲。真的很伤心。
  • 当代码不能按预期工作时,我建议你问问为什么。在某些情况下,它可能是 Ruby 中的一个错误,但这很有可能。在你怀疑罪魁祸首是 Ruby 中的一个错误之后,当它被证明是一个常见的初学者错误时,你看起来有点愚蠢。这有点像将编码问题归咎于你的硬件。
  • 是的,我 100% 同意你的看法。 1997 年,在我的第一堂 C 语言编程课上,我的导师称这个错误为“新生梦”。在这里,17 年后,我将我的新生梦想发布到 Stack Overflow。我确实偶尔会犯这些错误,但我们只能说昨天是漫长的一天,我的大脑受伤了。

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


【解决方案1】:

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

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

注意“==”

我们得到:

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

【讨论】:

    猜你喜欢
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 2013-11-19
    • 1970-01-01
    相关资源
    最近更新 更多