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}" }

На линии, где она написана «exance.instance_eval {block.call}», я пытаюсь найти другой способ сделать новый экземпляр переменной экземпляры Encement Run Eval в блоке. Единственный способ, которым я могу придумать, чтобы сделать это, это пройти, - это пройти exantember_eval исходный блок, не как переменная или что -то в этом роде, а как реальный блок, как в тестовом примере.

Какие-нибудь советы?

Это было полезно?

Решение

Да. Вы можете передать блок другому методу, составив переменную блока с помощью Ampersand Like So:

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