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

2023-12-09

使用 Ruby 1.9.2

Problem
比较两个过程的内容,而不是结果。我了解结果无法测试,因为停止问题但没关系;反正我也不想测试结果。

例如

proc {@x == "x"} == proc {@x == "x"}  => false # doh!

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

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

{@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 不兼容问题在我的公司。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

比较过程的内容,而不是结果 的相关文章

随机推荐

  • 在 directshow 中以编程方式更改录制文件

    我使用 directshow 制作了一个控制台应用程序 它从实时源 现在是网络摄像头 然后是电视捕获卡 进行记录 在叠加中添加当前日期和时间 然后将音频和视频保存为 asf 现在我希望输出文件每 60 分钟更改一次而不停止图表 我不能错过直
  • 多核处理器的多线程

    我有三星 Galaxy S3 它使用自己的 Exynos 4 四核处理器 所以我想优化我的应用程序 使其可以使用所有 4 个处理器核心 所以我做了一些测试 在一个线程中运行任务 处理时间 8 秒 在四个线程中运行任务 处理时间 仍为 8 秒
  • 如何在Lua中获取表的“sizeof”?

    我正在使用 Lua 涉足 Love2D 并且刚刚实现了一个 StateMachine 来处理一组状态之间的转换 例如IntroState MenuState PlayState 等 在以前的程序中 我通常释放只是 一次性交易 的对象和 或状
  • 如何添加注释以从 jacoco 代码覆盖率报告中排除方法?

    我有一些 Java 代码 我想将其从代码覆盖率中排除 我该怎么做 我希望能够添加注释 有没有办法配置或扩展 jacoco 如 gradle 中使用的 来使用它 Example public class Something ExcludeFr
  • python 有排序列表吗?

    我的意思是一个结构 O log n 复杂度x push 运营 查找元素的复杂度为 O log n 计算复杂度为 O n list x 将被排序 我还有一个关于性能的相关问题list insert 现在是here 您的大 O 要求有什么特殊原
  • Python Unittest:打开并等待程序关闭

    目前 我尝试创建一个打开文件 使用相应的应用程序 的单元测试 然后测试运行应该等到程序关闭 def test HFG self print please edit this file os chdir r C test a os start
  • Excel VBA 比较列数据复制行

    好吧 在这里许多编码专家的帮助下 我设法以某种方式编写了这段代码 我需要创建一个宏来比较两个工作表中的数据 在我的两个工作表中 都有一个名为 eRequest ID 的列 我必须复制以下记录行 DO NOT有一个 eRequest ID 两
  • Magento 免费送货和优惠券折扣

    我有一个免费送货价格规则 其配置如下 所有客户群体 无优惠券 每个客户的使用次数 0 条件 购物车总数 gt 100 发货国家 地区 NL 或 BE 或 DE 免费送货 与配套商品一起发货 然而 当我输入具有固定折扣金额的优惠券时 免费送货
  • RestTemplate + ConnectionPoolTimeoutException:等待来自池的连接超时

    当应用程序没有任何负载时 我在生产中突然遇到此错误 当我的代码尝试使用 Spring Rest 模板发送 PUT 消息时出现问题 这是我如何初始化restTemplate的代码 private static final RestTempla
  • 实体框架中的缓存如何工作?

    我看到大量关于人们努力让 EF 不发送缓存数据的帖子 我坐在这里想知道他们如何让它发送缓存数据 详细信息如下 使用 Entity Framework Core 6 0 6 的 NET 6 0 上的 ASP NET Core 最新版本 通过
  • 为什么我的图像加载在 Firefox 和 Internet Explorer 中没有触发?

    我正在尝试使用该解决方案检测几张图像何时完成加载在这里找到 该解决方案在 Chrome 和 Safari 中运行良好 但在 Firefox 和 IE 中失败 没有错误 预加载函数如下 var preloadPictures function
  • Tensorflow 警告 - 无法加载动态库“cupti64_101.dll”; dlerror:找不到 cupti64_101.dll

    我见过与 cupti dll 错误相关的其他类似问题 然而 答案似乎是dll位置需要在路径中 嗯 我的 dll 在路径中 标题中列出的警告后面是几个与未加载 cupti dll 相关的错误 venv PS D Projects tensor
  • Grails 多数据源域问题

    我有一个项目 表分布在两个数据源之间 我正在配置代码以按照 grails 文档中的 3 3 6 主题访问表http grails org doc 2 0 0 M2 guide conf html dataSourcesAndEnvironm
  • 使用 cordova 1.5 的 xcode 没有准备好设备且没有 console.log

    这是我拥有的所有代码 我既没有得到 xcode 中的日志 也没有得到 deviceReady 事件 我在任何其他平台上也没有得到该事件 在 Ubuntu Android Eclipse 上 我确实得到了控制台日志 但没有 deviceRea
  • 检测时间线上的冲突,第 2 部分:隔离“真实”重叠

    这是我关于绘制重叠时间冲突的时间轴调度算法的原始问题的延续 PART 1 检测调度程序时间线上的冲突 算法 我得到了正确的算法 如下所示 在 24 小时时间轴上分割 冲突 事件 使冲突组中的每个项目占据窗口的 N 我当前的问题 第 2 部分
  • 相当于

    与 css 的 valign=center

    我的页面上有以下代码 p align left style font size 10pt display block height 200px Content p 我希望文本在中心垂直对齐p tag Using vertical align
  • protobuf-net :不支持 IExtensible 继承

    似乎无法实施protobuf net通过定义其子类型的类的序列化 ProtoInclude 并实施ProtoBuf IExtensible ProtoBuf ProtoInclude 1000 typeof DerivedClass pub
  • HTML 表单值和“后退”按钮

    如何在点击后退按钮时保留 HTML 表单信息 这是默认的 HTML 或浏览器行为吗 或者它依赖于浏览器 这是默认的浏览器行为 但仅当包含表单的页面可缓存时 例如设置了标头 以便允许浏览器缓存它 SO 的形式如何记住以前的输入值
  • JasperReports:如何在jsp页面中调用报表

    我使用 做了一份 jasper 报告iReport 3 7 4 version 现在我必须在我的 java 应用程序中使用它或调用该报告 我使用 servlet jsp 和 struts 框架 apache tomcat 作为服务器 我想要
  • 比较过程的内容,而不是结果

    使用 Ruby 1 9 2 Problem比较两个过程的内容 而不是结果 我了解结果无法测试 因为停止问题但没关系 反正我也不想测试结果 例如 proc x x proc x x gt false doh 这会返回 false 因为过程中的