2009-11-04 4 views
11

블록을 사용하는 메소드가 있습니다.Ruby 블록의 소스 코드 인쇄하기

분명히 나는 ​​전달 될 내용과 내가 여기 들어 가지 않을 기묘한 이유를 알지 못합니다. 나는 블록의 내용을 인쇄하고 싶습니다.

이 방법이 있습니까?

답변

9

to_ruby 메소드를 구현하는 Ruby2Ruby에서이 작업을 수행 할 수 있습니다.

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

def meth &block 
    puts block.to_ruby 
end 

meth { some code } 

출력됩니다 :

"proc { some(code) }" 

나는 또한 Github에서의 크리스 Wanstrath에 의해이 멋진 이야기를 체크 아웃 것은 http://goruco2008.confreaks.com/03_wanstrath.html 그는 몇 가지 흥미로운 ruby2ruby 및 파스 트리의 사용 예를 보여줍니다.

+0

이 기능은 Ruby 1.8에서만 작동합니까? http://blog.zenspider.com/2009/04/parsetree-eol .html은 Parse를 처리하기 위해 "블록/proc 지원 삭제"에 대해 이야기합니다. 루비 1.9에서는 트리를 사용할 수 없습니다. –

+0

아니요, 루비 1.9에서 작동하지 않습니다. 왜냐하면 파스 트리가 작동하기 위해 필요한 후크를 제공하지 않기 때문입니다. 분명히 1.9에서 sexp을 얻으려고 noway있다. 이것은 큰 문제는 아닙니다. 왜냐하면 모든 사람들이 루비 니 우스와 같은 1.9 개의 다른 vms로 스위치를 전환하기 때문에 프라임 타임에 사용할 수 있어야하기 때문입니다. Rubinius는 기본적으로 모든 객체에 대해 to_sexp를 포함하므로 이러한 종류의 작업을 수행하는 것은 간단합니다. –

3

Evangenieur의 대답에 건물, 여기에 루비 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 } 

우리 회사는 탄소 계산을하는 데 사용되는 루비 코드를 표시하려면이 옵션을 사용하여 ... 우리는 파스 트리를 사용 Ruby 1.8 및 지금은 sourcify with Ruby 1.9입니다.

2

루비 1.9+ (2.1.2 테스트)에서는 block#source를 통해 https://github.com/banister/method_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! 

참고 소스 위해서는 당신이 필요로 읽을 수 있음 파일을 사용하고 파일을 실행하려면 (irb에서 테스트하면 다음 오류가 발생합니다. MethodSource::SourceNotFoundError: Could not load source for : No such file or directory @ rb_sysopen - (irb)