有谁知道为什么会失败?
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 `
答案 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
“集合中的每个元素都将传递给指定的备忘录方法。在任何一种情况下,结果都会成为备忘录的新值。”
您看到的具体错误消息是它正在尝试将[]运算符应用于您的字符串,这会导致错误消息。