0

我正在使用 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) }

我想使用类似这样的注入方法:

args ||= {}

@ivars = args.inject({}) { |result, (key, opts)| result.merge( @i_vars[key] = IVar.new(key, opts, args.keys) ) }

但是,后一个代码在设置@i_vars变量时会返回不同的结果。我也尝试了该方法的其他实现,inject但没有成功。

有没有办法重构代码?或者,也许,我应该使用其他方法或某些 RoR 功能(我不知道)?

4

2 回答 2

1

看看each_with_object

@i_vars = args.each_with_object({}) do |key,opts,result|
  result[key] = IVar.new(key, opts, args.keys)
end
于 2012-10-21T10:43:46.710 回答
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]
于 2012-10-21T10:54:16.960 回答