【发布时间】: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