2013-01-19 53 views
1

我正在玩Regex#to_s禁用選項%r/../。但是,越來越困惑與此類Regex#to_s的輸出:與%r /..../ option.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中是如何工作的(任何小代碼都能理解)?

+0

任何人都可以通過回答爲什麼不'o'和爲什麼總是'我,m,x'除了'o'嗎? – DoLoveSky

回答

2

我認爲你的理解是顛倒的;短劃線左側的選項開啓,而短劃線右側的選項關閉。

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

每三個選項出現在每個正則表達式字符串,但它們的存在,以破折號的左邊或右邊指示選項是否開啓或關閉。

關於你的第二個問題,Regexp#hash只是一個爲給定的正則表達式生成相同的Fixnum的方法。這允許您比較兩個不同的Regexp選項以實現有效的相等。有關更多詳細信息,請參閱Object#hash

+0

是的,我希望通過一個小代碼來查看'Regex#hash'和'Regex#quote'。你給我一個'string#hash'的鏈接:) – DoLoveSky

+0

爲什麼不是'o'的情況?爲什麼默認總是'm,x,i'不是'o'? – DoLoveSky

+0

直接從doc獲得Regexp#hash的實現。它在C中實現。「o」不顯示在正則表達式中的原因是因爲它的作用; 「o」在序列化的正則表達式字符串中沒有任何意義。插值只需在序列化正則表達式之前執行即可。 –