在ruby中,如何针对一组混合数据类型测试输入字符串?

在ruby中,如何针对一组混合数据类型测试输入字符串?,ruby,marc,Ruby,Marc,我试图在ruby中编写一个基本的MARC验证器,它基于一个简短的必填字段和可选字段列表,部分是为了练习用ruby编写一些我不太熟悉的东西 我想出了一个有效的ruby代码来存储我的“可选”字段(当启用此代码时,脚本将执行): 根据我有限的阅读,这在技术上是可行的…但我不确定从这里走到哪里。我希望遍历记录中的各个字段,如果某个字段(或子字段,如果注意到)缺失,请在屏幕上写一条警告: sysnum = record['001'] record.fields.each do |field| Opti

我试图在ruby中编写一个基本的MARC验证器,它基于一个简短的必填字段和可选字段列表,部分是为了练习用ruby编写一些我不太熟悉的东西

我想出了一个有效的ruby代码来存储我的“可选”字段(当启用此代码时,脚本将执行):

根据我有限的阅读,这在技术上是可行的…但我不确定从这里走到哪里。我希望遍历记录中的各个字段,如果某个字段(或子字段,如果注意到)缺失,请在屏幕上写一条警告:

sysnum = record['001']
record.fields.each do |field|
  Optional.each do |optfield|
    if field.tag =~ optfield
      break
    else
      puts "#{sysnum} is missing #{field.tag}"
    end
  end
end
但是,这并不适用于我的所有情况,因为并非所有的
optfield
值都是字符串。我应该使用if块来测试散列吗?正则表达式的值呢?当右侧不是正则表达式(
string=~otherstring
而不是
string=~regex
)时,
=~
会测试true吗


我是不是找错人了?

你可能想用
==
,你可以读作“有点平等”。它适用于字符串和regexp,正如您所期望的:

'100' === '100'
# true
/1\d\d/ === '100'
# true

对于数组,您可以使用它将字符串数组转换为与任何字符串匹配的regexp。

我认为您还需要反转逻辑。迭代可选字段并检查每个字段是否都在记录中。@Max,您是正确的。谢谢你的接球!我可能不会注意到逻辑错误,直到我有了更具体的用例进行测试,并发现我没有得到我期望看到的错误。这需要一些实验和阅读,但在Regexp.union和triple equals之间,我能够让代码正常工作。需要注意的是,给我带来麻烦的是左侧决定了
==
的工作方式。如果不知道这一点,它可能会有点混乱。重要的是要记住,
==
是一种方法,因此左侧决定行为是有意义的。事实上,
==
也是如此。是的,我不熟悉Ruby,这对我来说是新的。不过,现在我明白了,它非常有用。
'100' === '100'
# true
/1\d\d/ === '100'
# true