2010-01-17 9 views
17

Nehmen Sie dieses Beispiel:Ruby-Block Zeichenfolge anstelle der Ausführung

write_as_string { puts 'x' } 

Ich möchte dann in der Lage

def write_as_string(&block) 
    puts block.to_s 
end 

zu tun, wenn ich dies ausführen, möchte ich die Ausgabe sein:

Ich möchte in der Lage sein, den Block zu empfangen und den tatsächlichen Code für den Block abrufen, anstatt es auszuführen.

Motivation: Erstellen einer DSL, möchte ich die Mock in eine Reihe von anderen Methodenaufrufen, versteckt aus dem aufrufenden Code - mit vorhandenen Objekten und Methoden ohne Affe sie zu patchen umgewandelt werden.

Alle Ideen dazu wäre großartig!

Dank

Ben

Antwort

1

Sie wollen die ruby2ruby gem, die dies gut tut. Um einen Block zu analysieren, hängt dieser Edelstein leider von ParseTree ab, welches unsupported in Ruby 1.9 ist.

+0

Das scheint cool. Aber im folgenden Beispiel muss ich den definierten Block irgendwie als String erhalten. Wie könnte ich das tun? rubin = "def A \ n setzt 'A' \ n end \ \ ndEF b \ n na \ n end" parser = RubyParser.new ruby2ruby = Ruby2Ruby.new sexp = parser.process (Rubin) Oder Ich habe etwas verpasst? –

+0

Wenn Sie über die 1.9 Kompatibilität nicht besorgt sind, empfehle ich die Antwort von @ mletterle. – austinfromboston

3

Duplizieren: Printing the source code of a Ruby block

sudo gem install ParseTree 
sudo gem install ruby2ruby 

dann

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

def block_as_string &block 
    block.to_ruby 
end 

Ergebnisse in

irb(main):008:0> block_as_string {puts 'x'} 
=> "proc { puts(\"x\") }" 
18

Wenn Sie Ruby sind 1.9, können Sie die sourcify gem verwenden. Es stellt ProC# to_source zur Verfügung, das wie ParseTree's ProC# to_ruby ist. attached_to Option:

Wenn sourcify verwenden, wenn Sie Procs in Ihrem Quellcode verschachtelt haben, können Sie es zusammen mit der Hilfe müssen

## (Works in Ruby 1.8) Using ParseTree (with parse_tree_extensions) 
block.to_ruby 
## (Works in Ruby 1.9) Using sourcify 
block.to_source 
## Try this if you get Sourcify::NoMatchingProcError or Sourcify::MultipleMatchingProcsPerLineError 
block.to_source :attached_to => :name_of_block_in_source_code 

ich gepostet über ParseTree and Ruby 1.9 in Blog meiner Firma.

+0

Ich hatte Glück mit dem Juwel von source_method für Ruby 2.1.2 (welches als eine Abhängigkeit beinhaltet, also war es bereits in unserer Testinfrastruktur wo ich es brauchte). Ich habe eine ausführliche Antwort hier: http://stackoverflow.com/questions/1675053/printing-the-source-code-of-a-ruby-block/36654421#36654421 – Nick

Verwandte Themen