6

これが私がやろうとしていることです:

def call_block(in_class = "String", &block)
    instance = eval("#{in_class}.new")
    puts "instance class: #{instance.class}"
    instance.instance_eval{ block.call }
end


# --- TEST EXAMPLE ---
# This outputs "class: String" every time
"sdlkfj".instance_eval {  puts "class: #{self.class}" }

# This will only output "class: Object" every time
# I'm trying to get this to output "class: String" though
call_block("String") { puts "class: #{self.class}" }

「instance.instance_eval{block.call}」と書かれている行で、新しいインスタンス変数がブロック上でインスタンスを評価するようにする別の方法を見つけようとしています。それを実現するために私が考えることができる唯一の方法は、instance_evalを元のブロックに渡すことです。変数などとしてではなく、テスト例のように実際のブロックとして渡します。

任意のヒント?

4

1 に答える 1

9

はい。次のように、ブロック変数の前にアンパサンドを追加することで、ブロックを他のメソッドに渡すことができます。

def foo &blk
  # now, blk is a variable bound to a block object
  bar &blk
end

「class: Object」を取得する理由は、Ruby がレキシカル スコープを使用しているためです。これは、 self がデフォルトのコンテキストであるputs "class: #{self.class}"を参照することを意味します。main

于 2010-03-18T08:56:46.070 に答える