ruby – 比较Procs的内容,而不是结果
使用
Ruby 1.9.2
问题 例如 proc {@x == "x"} == proc {@x == "x"} => false # doh! 返回false,因为procs中的对象不一样. 我笨重的解决方案 {@x == "x" && @y != "y" || @z == String} 我编写了一个动态构建类的方法,并创建了设置为指定值的实例变量: 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 可以使用这样的东西: class Foo attr_accessor :block end foo = Foo.new foo.block = proc {@x == "x" && @y != "y" || @z == String} tester = create_proc_tester(:x => "x",:y => "y",:z => Fixnum) puts "Test #1: #{tester.xql? &foo.block}" tester = create_proc_tester(:x => "x",:y => "x",:z => String) puts "Test #2: #{tester.xql? &foo.block}" > Test #1: false > Test #2: true . 我在想可能有一种方法可以使用Ruby解析器来比较,但我不知道如何.我现在正在研究它,但我想我会试着看看这里是否有人这样做过,并且知道如何做.这可能是一个死胡同,但由于Ruby的动态特性,但这就是我现在正在寻找的地方. 解决方法
如果你使用Ruby 1.9,你可以使用sourcify gem.
$irb > require 'sourcify' => true > a = proc {@x == "x"} => #<Proc:0x9ba4240@(irb):2> > b = proc {@x == %{x}} => #<Proc:0x9ba23f0@(irb):3> > a == b => false > a.to_source == b.to_source => true > RUBY_VERSION => "1.9.2" 我们也在我的公司遇到了ParseTree/Ruby 1.9 incompatibility problem. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |