元の回答を大幅に改善しました。それ自体から継承すると、よりクリーンになりますBinding
。to_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 を渡す必要があるため、完全ではありません。これを改善する方法についての提案をお待ちしています。