Ruby-別の関数に実際のブロックとしてパラメージとしてブロックを渡すことができますか?
-
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
, 、デフォルトのコンテキスト。
所属していません StackOverflow