相关疑难解决方法(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代码?

这可能吗?

def block_to_s(&blk)
  #code to print blocks code here
end

puts block_to_s do
  str = "Hello"
  str.reverse!
  print str
end
Run Code Online (Sandbox Code Playgroud)

这将打印终端的跟随:

str = "Hello"
str.reverse!
print str
Run Code Online (Sandbox Code Playgroud)

ruby

8
推荐指数
1
解决办法
5758
查看次数

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

使用 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
查看次数

标签 统计

ruby ×4

introspection ×1

metaprogramming ×1