2009-11-04 21 views

Odpowiedz

9

Możesz to zrobić za pomocą Ruby2Ruby, która implementuje metodę to_ruby.

require 'rubygems' 
require 'parse_tree' 
require 'parse_tree_extensions' 
require 'ruby2ruby' 

def meth &block 
    puts block.to_ruby 
end 

meth { some code } 

wyjście wola:

"proc { some(code) }" 

Chciałbym również sprawdzić to niesamowite rozmowy przez Chris Wanstrath z Github http://goruco2008.confreaks.com/03_wanstrath.html On pokazuje kilka ciekawych przykładów ruby2ruby i użytkowania drzewo wyprowadzenia.

+0

Czy działa to tylko z Ruby 1.8? http://blog.zenspider.com/2009/04/parsetree-eol .html mówi o "zrzucaniu bloku/proc supportu", aby poradzić sobie z Parse Drzewo nie jest dostępne w rubinach 1.9. –

+0

Nie, to nie zadziała w Rubim 1.9, ponieważ nie zapewnia wymaganych haczyków do działania ParseTree. Najwyraźniej jest noway, aby uzyskać seksu w 1.9. Nie jest to duży problem, ponieważ do czasu, kiedy wszyscy przejdą na 1.9 inne vms, tak jak Rubinius powinien być dostępny w prime time. Rubinius natywnie zawiera plik to_sexp dla wszystkich obiektów, więc wykonywanie tych operacji będzie banalne. –

3

Opierając się na odpowiedź Evangenieur, oto jest odpowiedź Corban jeżeli miałeś 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 } 

Moja firma używa do wyświetlania kodu Ruby wykorzystywane do wykonywania obliczeń węgla ... użyliśmy drzewo wyprowadzenia z Ruby 1.8 i teraz sourcify with Ruby 1.9.

2

W Ruby 1.9+ (testowane z 2.1.2), można użyć https://github.com/banister/method_source

wydrukować źródłowego poprzez 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! 

pamiętać, że w porządku dla źródła należy czytać trzeba aby użyć pliku i wykonać plik (testowanie go z irb spowoduje następujący błąd: MethodSource::SourceNotFoundError: Could not load source for : No such file or directory @ rb_sysopen - (irb)