Ruby注入最初是一个散列
任何人都可以告诉我为什么以下几点:
['a', 'b'].inject({}) {|m,e| m[e] = e } 抛出错误:
 IndexError: string not matched from (irb):11:in `[]=' from (irb):11:in `block in irb_binding' from (irb):11:in `each' from (irb):11:in `inject' from (irb):11 from C:/Ruby192/bin/irb:12:in `<main>' 
而下面的作品?
 a = {} a["str"] = "str" 
	
你的块需要返回积累的散列:
 ['a', 'b'].inject({}) {|m,e| m[e] = e; m } 
 而是在第一遍之后返回string“a”,在下一个遍中变成m ,最后调用string的[]=方法。 
@Rob说,块必须返回累加器(哈希)。 一些替代品:
 使用Hash#update : 
 hash = ['a', 'b'].inject({}) { |m, e| m.update(e => e) } 
 用Enumerable#each_with_object : 
 hash = ['a', 'b'].each_with_object({}) { |e, m| m[e] = e } 
 用Hash#[] : 
 hash = Hash[['a', 'b'].map { |e| [e, e] }] 
来自Facets的Enumerable#mash :
 require 'facets' hash = ['a', 'b'].mash { |e| [e, e] } 
 用Array#to_h (Ruby> = 2.1): 
 hash = ['a', 'b'].map { |e| [e, e] }.to_h 
 而不是使用注入,你应该看看Enumerable#each_with_object 。 
 凡inject要求您返回被累积的对象, each_with_object自动执行。 
从文档:
用给定的任意对象遍历每个元素的给定块,并返回最初给定的对象。
如果没有给出块,则返回一个枚举器。
例如:
 evens = (1..10).each_with_object([]) {|i, a| a << i*2 } #=> [2, 4, 6, 8, 10, 12, 14, 16, 18, 20] 
所以,更接近你的问题:
 [1] pry(main)> %w[ab].each_with_object({}) { |e,m| m[e] = e } => {"a"=>"a", "b"=>"b"} 
 请注意, inject和each_with_object颠倒所产生参数的顺序。