相关疑难解决方法(0)

如何从Proc对象中提取代码?

给定一个Proc对象,是否可以查看其中的代码?

例如:

p = Proc.new{test = 0}
Run Code Online (Sandbox Code Playgroud)

我需要的是从某个已经创建的Proc对象获取字符串"test = 0"的方法.

ruby

20
推荐指数
3
解决办法
8083
查看次数

Ruby阻止字符串而不是执行

举个例子:

write_as_string { puts 'x' }
Run Code Online (Sandbox Code Playgroud)

然后我希望能够做到

def write_as_string(&block)
  puts block.to_s
end
Run Code Online (Sandbox Code Playgroud)

当我执行此操作时,我希望输出为:

"puts 'x'"
Run Code Online (Sandbox Code Playgroud)

我希望能够接收块并获取块的实际代码而不是执行它.

动机:创建DSL,我希望将模拟转换为许多其他方法调用,隐藏在调用代码中 - 使用现有的对象和方法,而不用猴子修补它们.

对此的任何想法都会很棒!

谢谢

ruby

17
推荐指数
2
解决办法
7400
查看次数

打印Ruby块的源代码

我有一个方法,需要一个块.

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

有没有办法做到这一点?

ruby

11
推荐指数
2
解决办法
3908
查看次数

将Proc和Method转换为String

可能重复:
如何从Proc对象中提取代码?

将proc或方法对象转换为源字符串的最佳方法是什么?到目前为止,我尝试了两种方法.一个是实现proc的源位置并读取该部分源代码.另一种是使用库巫师和开膛手.我不确定这样做的正确方法是什么.什么是最好的可能取决于各种因素:稳健性,对原始的忠诚度,速度等.包括我建议的方法,但不限于它们,请建议一个策略,并评估其局限性.

ruby ruby-1.9 ruby-1.9.2

6
推荐指数
0
解决办法
683
查看次数

比较过程的内容,而不是结果

使用 Ruby 1.9.2

问题
比较两个过程的内容,而不是结果。我知道由于停止问题而无法测试结果,但这没关系;反正我也不想测试结果。

例如

proc {@x == "x"} == proc {@x == "x"}  => false # doh!
Run Code Online (Sandbox Code Playgroud)

这会返回 false,因为过程中的对象不相同。

我笨重的解决方案
我有一个解决方案,有点像我想要的那样,但它并没有真正测试过程是否“等于”我放入其中的内容。在我的具体情况下,我的过程的格式将始终是对实例变量的布尔测试,如下所示:

{@x == "x" && @y != "y" || @z == String} 
Run Code Online (Sandbox Code Playgroud)

我编写了一个动态构建类并创建设置为指定值的实例变量的方法:

def create_proc_tester(property_value_hash)
  new_class = Class.new.new

  new_class.class.class_eval do
     define_method(:xql?) { |&block| instance_eval &block }
  end

  property_value_hash.each do |key, value| 
    new_class.instance_variable_set("@#{key}", value)
  end

  new_class
end
Run Code Online (Sandbox Code Playgroud)

可以这样使用:

class Foo
  attr_accessor :block
end

foo = Foo.new
foo.block = proc {@x == "x" && @y != "y" || …
Run Code Online (Sandbox Code Playgroud)

ruby metaprogramming introspection

5
推荐指数
1
解决办法
844
查看次数