打印Ruby块的源代码

时间:2009-11-04 16:38:42

标签: ruby

我有一个阻止的方法。

显然我不知道会传递什么,并且出于奇怪的原因我不会进入这里我想要打印块的内容。

有办法做到这一点吗?

6 个答案:

答案 0 :(得分: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的Chris Wanstrath发表的精彩演讲http://goruco2008.confreaks.com/03_wanstrath.html他展示了一些有趣的ruby2ruby和parsetree用例。

答案 1 :(得分:4)

在Evangenieur的回答基础上,如果你有Ruby 1.9,这是Corban的回答:

# 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代码......我们使用ParseTree和Ruby 1.8,现在sourcify with Ruby 1.9

答案 2 :(得分:3)

在Ruby 1.9+(使用2.1.2测试)中,您可以使用https://github.com/banister/method_source

通过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!

请注意,为了读取源代码,您需要使用文件并执行该文件(从irb中测试它将导致以下错误:MethodSource::SourceNotFoundError: Could not load source for : No such file or directory @ rb_sysopen - (irb)

答案 3 :(得分:2)

在Ruby 1.9中,您可以尝试从源文件中提取代码的gem。

https://github.com/ngty/sourcify

答案 4 :(得分:1)

在 ruby​​ 2.7 中,使用 method_source gem(撬起取决于它)

Set.instance_method(:merge).source.display
# =>
def merge(enum)
  if enum.instance_of?(self.class)
    @hash.update(enum.instance_variable_get(:@hash))
  else
    do_with_enum(enum) { |o| add(o) }
  end

  self
end

repo 说它适用于 procs,但我还没有测试过。

答案 5 :(得分:0)

在 Ruby 2.5 中,以下工作

puts block.source