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

In ruby, how can I test input strings against a set of mixed data types?

我正在尝试根据必填字段和可选字段的简短列表在 ruby 中编写一个基本的 MARC 验证程序,部分是作为在 ruby 中编写内容的练习,我不是很熟悉。

我想出了看起来有效的 ruby 代码来存储我的 "optional" 字段(并且脚本在启用代码时执行):

Optional = ['006', '007', '010', '020', '022', {'040' => ['c']}, '041', ['050',  '060',  '082',  '086',  /09\d/], {/1\d\d/ => ['a']}, {'240' => ['a']}, '250', {'260' => ['a',  'b',  'c']}, {'300' => ['a']}, '490', /7[0-5]\d/, '830']

根据我有限的阅读,这在技术上是可行的...但我不确定从这里该何去何从。我想遍历记录中的各个字段,如果缺少一个字段(或子字段,如果有的话),在屏幕上写一个警告:

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)时,=~ 会测试为真吗?

我是不是找错人了?

您可能想使用 ===,您可以读作 "kinda equals"。如您所料,它适用于字符串和正则表达式:

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

对于您的数组,您可以使用 Regexp.union 将字符串数组转换为匹配任何这些字符串的正则表达式。