红宝石注入方法不做我认为它应该做的事情

时间:2011-10-18 04:15:49

标签: ruby-on-rails ruby

有谁知道为什么会失败?

ree-1.8.7-2011.03 :008 > 3.times.inject({}) {|result, el| result[el.months.ago.strftime("%B")] = "blah"}
IndexError: string not matched
  from (irb):8:in `[]='
  from (irb):8
  from (irb):8:in `inject'
  from (irb):8:in `each'
  from (irb):8:in `times'
  from (irb):8:in `each'
  from (irb):8:in `

4 个答案:

答案 0 :(得分:6)

inject将块的返回值作为result提供给下一次迭代,但是哈希赋值返回已分配的内容。从块中返回result

3.times.inject({}) {|result, el| result[el.months.ago.strftime("%B")] = "blah"; result }

或使用each_with_object因为你没有真正注射:

3.times.each_with_object({}) {|el, result| result[el.months.ago.strftime("%B")] = "blah" }

答案 1 :(得分:3)

这可能应该是对你的问题的评论,但它将是非常难以理解的,所以在这里:Enumerable#inject / Enumerable#inject在Ruby社区中被过度使用。在你的情况下,你是注入来构建一个哈希,但你有Hash.[]

Hash[(0...3).map { |x| [x.months.ago.strftime("%B"), "blah"] }]

使用Facets'mash

require 'facets'
(0...3).mash { |x| [x.months.ago.strftime("%B"), "blah"] }

使用Ruby> = 2.1:

(0...3).map { |x| [x.months.ago.strftime("%B"), "blah"] }.to_h

答案 2 :(得分:1)

因为该语句的返回值(在块中)是字符串,而不是散列。假设这是你以为你在做什么;)

前几天,当我没注意时,我就做了同样的事情:/

答案 3 :(得分:0)

请在此处查看第一条评论:

http://blog.purepistos.net/index.php/2008/01/03/ruby-string-not-matched/

您需要确保每次迭代的返回值都是您的哈希值,因为第二次运行它时,它是您在第一次迭代中分配的字符串。

另见:

http://www.ruby-doc.org/core-1.9.2/Enumerable.html#method-i-inject

“集合中的每个元素都将传递给指定的备忘录方法。在任何一种情况下,结果都会成为备忘录的新值。”

您看到的具体错误消息是它正在尝试将[]运算符应用于您的字符串,这会导致错误消息。