Ho un metodo che accetta un blocco.Stampa del codice sorgente di un blocco Ruby
Ovviamente non so ciò che sta per essere passato e per ragioni bizzarre che non voglio andare in qui voglio stampare il contenuto del blocco.
C'è un modo per farlo?
Ho un metodo che accetta un blocco.Stampa del codice sorgente di un blocco Ruby
Ovviamente non so ciò che sta per essere passato e per ragioni bizzarre che non voglio andare in qui voglio stampare il contenuto del blocco.
C'è un modo per farlo?
Si può fare questo con Ruby2Ruby che implementa un metodo to_ruby.
require 'rubygems'
require 'parse_tree'
require 'parse_tree_extensions'
require 'ruby2ruby'
def meth &block
puts block.to_ruby
end
meth { some code }
uscita volontà:
"proc { some(code) }"
vorrei anche controllare questo impressionante discorso di Chris Wanstrath di Github http://goruco2008.confreaks.com/03_wanstrath.html Egli mostra alcuni interessanti esempi ruby2ruby e di utilizzo ParseTree.
In Ruby 1.9, si può provare questo gioiello che estraggono il codice dal file di origine.
Sulla risposta di Evangenieur, ecco la risposta di Corban se aveste Ruby 1.9:
# Works with Ruby 1.9
require 'sourcify'
def meth &block
# Note it's to_source, not to_ruby
puts block.to_source
end
meth { some code }
La mia azienda utilizza questa opzione per visualizzare il codice Ruby usato per fare calcoli di carbonio ... abbiamo usato ParseTree con Ruby 1.8 e ora sourcify with Ruby 1.9.
In Ruby 1.9+ (testato con 2.1.2), è possibile utilizzare https://github.com/banister/method_source
Stampa la fonte tramite block#source
:
#! /usr/bin/ruby
require 'rubygems'
require 'method_source'
def wait &block
puts "Running the following code: #{block.source}"
puts "Result: #{yield}"
puts "Done"
end
def run!
x = 6
wait { x == 5 }
wait { x == 6 }
end
run!
Nota che, per la sorgente da leggere è necessario utilizzare un file ed eseguire il file (testarlo da irb comporterà il seguente errore: MethodSource::SourceNotFoundError: Could not load source for : No such file or directory @ rb_sysopen - (irb)
Funziona solo con Ruby 1.8? http://blog.zenspider.com/2009/04/parsetree-eol .html parla di "dropping block/proc support" per gestire Parse L'albero non è disponibile nel rubino 1.9. –
No questo non funzionerà in Ruby 1.9 in quanto non fornisce i ganci necessari affinché ParseTree funzioni. A quanto pare ora è possibile ottenere il sexp in 1.9. Questo non è un problema enorme perché quando tutti fanno il passaggio ad altri 1.9 vms come Rubinius dovrebbero essere disponibili per prime time. Rubinius include nativamente un to_sexp per tutti gli oggetti, quindi sarà banale eseguire questo tipo di operazioni. –