6

いくつかのローカル変数が与えられたcompact場合、Ruby で最も簡単な方法は何でしょうか?

def foo
  name = 'David'
  age = 25
  role = :director
  ...
  # How would you build this:
  # { :name => 'David', :age => 25, :role => :director }
  # or
  # { 'name' => 'David', 'age' => 25, 'role' => :director }
end

PHP では、次のように簡単に実行できます。

$foo = compact('name', 'age', 'role');
4

2 に答える 2

9

元の回答を大幅に改善しました。それ自体から継承すると、よりクリーンになりますBindingto_sym古いバージョンの ruby​​ には as 文字列があるためですlocal_variables

インスタンスメソッド

class Binding
  def compact( *args )
    compacted = {}
    locals = eval( "local_variables" ).map( &:to_sym )
    args.each do |arg|
      if locals.include? arg.to_sym
        compacted[arg.to_sym] = eval( arg.to_s ) 
      end 
    end 
    return compacted
  end
end

利用方法

foo = "bar"
bar = "foo"
binding.compact( "foo" ) # => {:foo=>"bar"}
binding.compact( :bar ) # => {:bar=>"foo"}

元の答え

これは、Php のように動作するメソッドに最も近いものですcompact-

方法

def compact( *args, &prok )
  compacted = {}
  args.each do |arg|
    if prok.binding.send( :eval, "local_variables" ).include? arg
      compacted[arg.to_sym] = prok.binding.send( :eval, arg ) 
    end
  end 
  return compacted
end

使用例

foo = "bar"
compact( "foo" ){}
# or
compact( "foo", &proc{} )

ただし、proc を渡す必要があるため、完全ではありません。これを改善する方法についての提案をお待ちしています。

于 2013-07-02T11:33:26.897 に答える