通过注入哈希来重构代码

时间:2012-10-21 10:38:39

标签: ruby-on-rails ruby hash iterator code-injection

我正在使用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功能(我不知道)?

2 个答案:

答案 0 :(得分:1)

查看each_with_object

@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)

但是无需使用injecteach_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]