可以任何人告诉我为什么以下:
['a', 'b'].inject({}) {|m,e| m[e] = e }
Run Code Online (Sandbox Code Playgroud)
抛出错误:
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>'
Run Code Online (Sandbox Code Playgroud)
而以下工作?
a = {}
a["str"] = "str"
Run Code Online (Sandbox Code Playgroud)
Rob*_*vis 73
您的块需要返回累积哈希:
['a', 'b'].inject({}) {|m,e| m[e] = e; m }
Run Code Online (Sandbox Code Playgroud)
相反,它在第一次传递后返回字符串'a',这将m
在下一次传递中变为最终调用字符串的[]=
方法.
tok*_*and 47
正如@Rob所说,该块必须返回累加器(哈希).一些替代品:
用Hash#update
:
hash = ['a', 'b'].inject({}) { |m, e| m.update(e => e) }
Run Code Online (Sandbox Code Playgroud)
用Enumerable#each_with_object
:
hash = ['a', 'b'].each_with_object({}) { |e, m| m[e] = e }
Run Code Online (Sandbox Code Playgroud)
用Hash#[]
:
hash = Hash[['a', 'b'].map { |e| [e, e] }]
Run Code Online (Sandbox Code Playgroud)
使用Array#to_h
(Ruby> = 2.1):
hash = ['a', 'b'].map { |e| [e, e] }.to_h
Run Code Online (Sandbox Code Playgroud)
使用Facets的Enumerable #mash:
require 'facets'
hash = ['a', 'b'].mash { |e| [e, e] }
Run Code Online (Sandbox Code Playgroud)
the*_*Man 21
你应该研究一下,而不是使用注入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]
Run Code Online (Sandbox Code Playgroud)
所以,更接近你的问题:
[1] pry(main)> %w[a b].each_with_object({}) { |e,m| m[e] = e }
=> {"a"=>"a", "b"=>"b"}
Run Code Online (Sandbox Code Playgroud)
请注意inject
并each_with_object
反转生成的参数的顺序.
归档时间: |
|
查看次数: |
23706 次 |
最近记录: |