0

Ruby 1.9.2 と Ruby on Rails v3.2.2 gem を使用しています。次のコードを 1 行にリファクタリングしたいと思います。

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

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]
于 2012-10-21T10:54:16.960 に答える