Ruby-別の関数に実際のブロックとしてパラメージとしてブロックを渡すことができますか?

StackOverflow https://stackoverflow.com/questions/2468446

  •  20-09-2019
  •  | 
  •  

質問

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

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を元のブロックに渡すことです。

任意のヒント?

役に立ちましたか?

解決

はい。 Ampersandのようにブロック変数を準備することで、ブロックを他の方法に渡すことができます。

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

あなたが「クラス:オブジェクト」を取得している理由は、Rubyが語彙スコーピングを使用しているからです。これは、その自己を意味します puts "class: #{self.class}" 指します main, 、デフォルトのコンテキスト。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top