Ruby - Möglich, um einen Block als Param als tatsächlicher Block an eine andere Funktion zu übergeben?

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

  •  20-09-2019
  •  | 
  •  

Frage

Das versuche ich zu tun:

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

In der Zeile, in der es "instance.instance_eval {block.call}" besagt, versuche ich, eine andere Möglichkeit zu finden, um die neue Instanzvariable -Instanz -Instanz -Evaling auf dem Block zu gestalten. Ich kann mir nur vorstellen, dass es dazu führt, dass Instance_eval den ursprünglichen Block nicht als Variable oder irgendetwas, sondern als realer Block wie im Testbeispiel passieren kann.

Irgendwelche Tipps?

War es hilfreich?

Lösung

Ja. Sie können den Block an die andere Methode übergeben, indem Sie die Blockvariable mit einem Verstärker vorbereiten und wie dies:

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

Der Grund, warum Sie "Klasse: Objekt" erhalten, ist, dass Ruby einen lexikalischen Scoping verwendet. Das bedeutet, dass Selbst in puts "class: #{self.class}" bezieht sich auf main, der Standardkontext.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top