2017-06-12 5 views
2

Gibt es eine Möglichkeit, den aktuell ausgeführten Block in Ruby für eine einmalige Rekursion zu referenzieren? Zum Beispiel wird eine „tiefe“ merge auf Hashes auszuführen:Ruby: Referenz auf den aktuell ausgeführten Block

hash1.merge(hash2) do |k,o,v| 
    (o.is_a?(Hash) && v.is_a?(Hash)) ? o.merge(v, &CURRENT_BLOCK) : v 
end 

Ich weiß, dass ich nur den Block definieren könnte extern und verweisen Sie, ich frage mich nur, ob es möglich ist, es an Ort und Stelle zu tun.

+0

Interessante Frage. Was ist 'h2'? –

+0

@EricDuminil Mein Fehler, 'h2' sollte' v' sein. Fest. –

Antwort

1

Ich glaube, Sie suchen nach einer Art von Y combinator in Ruby. Ich glaube nicht, dass dies möglich ist, mit gewöhnlichen Blöcken in Ruby zu tun, aber Sie können etwas ähnliches with lambdas tun:

lambda { |x| p x += 1; redo }[0] 

Alternativ können Sie einen Y Combinator-Generator unter Verwendung von Verfahren oder lambda implementieren, wie auf this RosettaCode page gezeigt.

Verwandte Themen