我正在使用Ruby 1.9.2和Ruby on Rails v3.2.2 gem。我想将以下代码重构为一行:
args ||= {}
@i_vars = {}
args.each { |key, opts| @i_vars[key] = IVar.new(key, opts, args.keys) }
我想使用这样的inject方法:
args ||= {}
@ivars = args.inject({}) { |result, (key, opts)| result.merge( @i_vars[key] = IVar.new(key, opts, args.keys) ) }
但是,后一代码在设置@i_vars
变量时会返回不同的结果。我还尝试了inject
方法的其他实现,但没有成功。
有一种方法可以重构代码吗?或者,也许,我应该使用其他方法或某些RoR功能(我不知道)?
答案 0 :(得分:1)
@i_vars = args.each_with_object({}) do |key,opts,result|
result[key] = IVar.new(key, opts, args.keys)
end
答案 1 :(得分:1)
您应该在inject
区块中写下什么:
result.update(key => IVar.new(key, opts, args.keys)
但是无需使用inject
或each_with_object
来构建哈希,我们有Hash[pairs]
:
@i_vars = Hash[(args || {}).map { |k, opts| [k, IVar.new(k, opts, (args || {}).keys)] }
但是,我不会痴迷于单行,我会写一个相当但更清晰的代码:
hargs = args || {}
@i_vars = Hash[hargs.map do |key, opts|
[key, IVar.new(key, opts, hargs.keys)]
end]