Ruby: è possibile passare un blocco come parametro come blocco effettivo a un'altra funzione?

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

  •  20-09-2019
  •  | 
  •  

Domanda

Questo è quello che sto cercando di fare:

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

Sulla riga in cui dice "Instance.instance_eval {block.call}", sto cercando di trovare un altro modo per rendere la nuova variabile di istanza di eseguire l'istanza sul blocco. L'unico modo in cui riesco a pensare per farlo è passare istanza_eval il blocco originale, non come variabile o altro, ma come un blocco reale come nell'esempio del test.

Qualche consiglio?

È stato utile?

Soluzione

Sì. È possibile passare il blocco all'altro metodo preparando la variabile del blocco con un ampi e così:

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

Il motivo per cui stai ottenendo "Classe: Object" è che Ruby usa Scoping lessicale. Questo significa che sé puts "class: #{self.class}" si riferisce a main, il contesto predefinito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top