与%r /..../ option.to_s的输出混淆

时间:2013-01-19 14:00:06

标签: ruby

我正在玩,以查看Regex#to_s如何禁用模式%r/../的选项。但是对这种Regex#to_s的输出感到困惑:

irb(main):005:0> %r/ab+c/x.to_s
=> "(?x-mi:ab+c)"   #why here -m option has been disabled?

irb(main):006:0> %r/ab+c/i.to_s
=> "(?i-mx:ab+c)"   #why here -m option has been disabled?

irb(main):007:0> %r/ab+c/m.to_s
=> "(?m-ix:ab+c)"   #why here -i option has been disabled?

irb(main):008:0> %r/ab+c/o.to_s
=> "(?-mix:ab+c)"   #why here o option not get into the (...) as the above?

irb(main):009:0> %r/ab+c/.to_s
=> "(?-mix:ab+c)"   #why always m,i,x option get into the (...) as the above?

有没有人可以帮助我理解选项开启/关闭的逻辑?

Regex#hashRegex#quote方法如何在Ruby 1.9.3中工作(任何小代码都能理解相同的内容)?

1 个答案:

答案 0 :(得分:2)

我认为你的理解是倒置的;短划线左侧的选项已打开,而短划线右侧的选项已关闭。

/ab+c/x => "x-mi"
/ab+c/i => "i-mx"
/ab+c/m => "m-ix"

每个正则表达式字符串中都会显示三个选项中的每一个,但它们在短划线左侧或右侧的存在表示选项是打开还是关闭。

关于第二个问题,Regexp#hash只是为给定的Regexp生成相同Fixnum的方法。这允许您比较两个不同的Regexp选项以实现有效的相等性。有关详细信息,请参阅Object#hash