2009-11-04 29 views
11

Tôi có một phương thức cần một khối.In mã nguồn của khối Ruby

Rõ ràng là tôi không biết những gì sẽ được thông qua và vì lý do kỳ lạ mà tôi sẽ không đi vào đây tôi muốn in nội dung của khối.

Có cách nào để thực hiện việc này không?

Trả lời

9

Bạn có thể thực hiện việc này với Ruby2Ruby, thực hiện phương thức to_ruby.

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

def meth &block 
    puts block.to_ruby 
end 

meth { some code } 

chí đầu ra:

"proc { some(code) }" 

tôi cũng sẽ kiểm tra nói chuyện tuyệt vời này bởi Chris Wanstrath của Github http://goruco2008.confreaks.com/03_wanstrath.html Ông cho thấy một số ruby2ruby và sử dụng cây phân tích cú pháp ví dụ thú vị.

+0

Tính năng này chỉ hoạt động với Ruby 1.8? http://blog.zenspider.com/2009/04/parsetree-eol .html nói về "thả block/proc support" để đối phó với Parse Cây không có sẵn trong ruby ​​1.9. –

+0

Không có điều này sẽ không hoạt động trong ruby ​​1.9 vì nó không cung cấp các móc cần thiết cho ParseTree để làm việc. Có vẻ như bây giờ đã có sexp trong 1,9. Đây không phải là một vấn đề lớn bởi vì thời gian mọi người làm cho việc chuyển sang 1,9 vms khác như rubinius sẽ có sẵn cho thời gian chính. Rubinius tự nhiên bao gồm một to_sexp cho tất cả các đối tượng vì vậy nó sẽ là tầm thường để làm các loại hoạt động. –

3

Xây dựng về câu trả lời Evangenieur của, đây là câu trả lời Corban nếu bạn có của 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 } 

Công ty của tôi sử dụng này để hiển thị mã Ruby sử dụng để làm các phép tính carbon ... chúng tôi sử dụng cây phân tích cú pháp với Ruby 1.8 và bây giờ là sourcify with Ruby 1.9.

2

Trong Ruby 1.9+ (thử nghiệm với 2.1.2), bạn có thể sử dụng https://github.com/banister/method_source

In ra nguồn qua 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! 

Lưu ý rằng để cho các nguồn để được đọc bạn cần để sử dụng tệp và thực thi tệp (kiểm tra tệp từ irb sẽ dẫn đến lỗi sau: MethodSource::SourceNotFoundError: Could not load source for : No such file or directory @ rb_sysopen - (irb)