質問
を書きたい単純なルビー DSL訳あ算や表現を別の言語です。基本例することはできない。
some_function {
t + 2
}
ここで、tはrubyの変数は、このようにブロックできない(しないで下さい!) によって評価しなければならないます。その後、私のベストベットを使うの解析で出力(AST)に翻訳です。い利用できまParseTreeとruby2ruby.しかし、私はその他を構築しまう使用は、例えば:
1.upto(10) {|x|
some_function {
t + x
}
}
ここで、局所変数のとりさんがその価値のために自分のものに。しかし、この機能をブロックの評価んへのアクセスの局所変数の呼び出します。これまでのグローバル変数($x)、チェック場合は、その名前が存在しglobal_variables配列で、最悪の場合には使用<エバール>が、どうすればいいっていることはもちろん、局所変数の場合は可能なのでしょうか?
更新:
かを明確にすることとなる。てられたものを使用していruby2ruby(およびそのためParseTree)のASTを使用to_sexp)に対応したブロックです。を用いる場合、局所変数の中にブロックでは、出会うの
[:dvar, :x]
やるならば、変数の値からその名前を文字列として/シンボルです。やまだひさしをはじめとする利用method_missingはinstance_evalがしたい翻訳の表現を別の言語や文(RPN)。
別の解決に基づかないParseTreeも歓迎しかし、そうでないサイRuby1.9.
解決
の変数の値の論文集の結合:
def some_function(&block)
b = block.binding
p [b.eval("t"), b.eval("x")]
end
t = 1
1.upto(10) {|x|
some_function {
t + x
}
}
他のヒント
ここで、tはルビーの変数と このブロックできない(しないで下さい!) によって評価しなければならないます。
その理由は、"評価しない"の制限?このように思わ method_missing も優雅な対応を評価する"missing" t
変数はRubyのように自動的に逆参照の x
可変となります。
利用できるinstance_evalに対してオブジェクト t
.
class Context
attr_accessor :t
def initialize(_t)
@t = _t
end
end
def some_function(&block)
puts Context.new(1).instance_eval(&block)
end
1.upto(10) {|x|
some_function {
t + x
}
}