2010-01-17 29 views
17

Hãy ví dụ này:Block Ruby chuỗi thay vì thực hiện

write_as_string { puts 'x' } 

sau đó tôi muốn để có thể làm

def write_as_string(&block) 
    puts block.to_s 
end 

Khi tôi thực hiện điều này, tôi muốn đầu ra là:

"puts 'x'" 

Tôi muốn có thể nhận được khối và nhận mã thực tế cho khối thay vì thực hiện nó.

Động lực: Tạo DSL, tôi muốn mô phỏng được chuyển đổi thành một số cuộc gọi phương thức khác, ẩn từ mã gọi - sử dụng các đối tượng và phương thức hiện có mà không cần khỉ vá chúng.

Bất kỳ ý tưởng nào về điều này đều tuyệt vời!

Cảm ơn

Bến

Trả lời

1

Bạn muốn ruby2ruby gem, mà thực hiện điều này độc đáo. Thật không may, để phân tích một khối đá quý này phụ thuộc vào ParseTree, là unsupported in Ruby 1.9.

+0

Điều đó có vẻ thú vị. Nhưng với ví dụ sau, tôi cần bằng cách nào đó lấy khối được định nghĩa như một chuỗi. Làm thế nào tôi có thể làm điều này? ruby ​​= "def \ n puts 'A' \ Nend \ n \ NDEF b \ na \ Nend" phân tích cú pháp = RubyParser.new ruby2ruby = Ruby2Ruby.new sexp = parser.process (ruby) Hoặc có Tôi bị mất một cái gì đó? –

+0

nếu bạn không quan tâm đến 1,9 khả năng tương thích, tôi sẽ giới thiệu câu trả lời của @ mletterle. – austinfromboston

3

trùng lặp: Printing the source code of a Ruby block

sudo gem install ParseTree 
sudo gem install ruby2ruby 

sau đó

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

def block_as_string &block 
    block.to_ruby 
end 

kết quả trong

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

Nếu bạn đang ở trên của Ruby 1.9, bạn có thể sử dụng đá quý sourcify. Nó cung cấp cho ProC# to_source, giống như ProC# to_ruby của ParseTree.

Khi sử dụng sourcify, nếu bạn đã lồng procs trong mã nguồn của bạn, bạn có thể phải giúp nó cùng với: attached_to tùy chọn:

## (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 

tôi được đăng tải khoảng ParseTree and Ruby 1.9 trong blog của công ty tôi.

+0

Tôi đã may mắn với gem gem source_method cho Ruby 2.1.2 (mà pry bao gồm như là một sự phụ thuộc như vậy đã có sẵn trong cơ sở hạ tầng thử nghiệm của chúng tôi, nơi tôi cần nó). Tôi có câu trả lời chi tiết tại đây: http://stackoverflow.com/questions/1675053/printing-the-source-code-of-a-ruby-block/36654421#36654421 – Nick

Các vấn đề liên quan