2015-04-03 3 views
1

Если я хочу написать простое регулярное выражение в рубине, чтобы соответствовать только косую черту (/, U + 002F), я могу написать его, используя два синтаксических форм. Косая разделителями буквальным с обратной косой чертой слэша:Ruby 1.9.3 Regexp # ==: тот же шаблон, разные синтаксисы, различное равенство

/\// 

или с помощью «процент-р» синтаксис, в котором нет никакой необходимости слеш:

%r{/} 

Итак, мой вопрос: в Ruby 1.9.3, Почему эти два «эквивалентных» регулярных выражения не равны друг другу?

>> /\// == %r{/} 
=> false 

Они match одни и те же строки:

>> /\//.match('/') 
=> #<MatchData "/"> 

>> %r{/}.match('/') 
=> #<MatchData "/"> 

Они inspect то же самое:

>> /\// 
=> /\// 

>> %r{/} 
=> /\// 

Они to_s то же самое:

>> /\//.to_s 
=> "(?-mix:\\/)" 

>> %r{/}.to_s 
=> "(?-mix:\\/)" 

Но они не hash то же самое!

>> /\//.hash 
=> -913497737416042053 

>> %r{/}.hash 
=> 1283138729813860088 

Итак ... а как же они разные? Это что-то делать с обратной косой черты побег гольца, так как:

>> %r{\/} == %r{\/} 
=> true 

>> %r{/} == %r{\/} 
=> false 

Руби documentation on Regexp.== бормочет что-то о «наборах символов» и «шаблон» нуждающейся быть такой же, но услужливо не упоминает, что такое «наборы символов» и "шаблон".

+0

В Ruby 2.2.1 '/ \ // ==% r {/}' приводит к 'true'. Хэши тоже совпадают. –

+0

@PhilipHallstrom: Ах, да. Хороший звонок. Я тестировал их под 1.9.3 – pje

ответ

1

С Руби 1.9.3-P551, то source двух Regexp объектов отличается:

1.9.3-p551 :001 > /\//.source 
=> "\\/" 
1.9.3-p551 :002 > %r{/}.source 
=> "/" 

Regexp#==compares the source при проверке равенства.

Regexp#hashincludes the source в вычислении хеш-кода.

С Рубин 2.0.0-p0 и спустя source из слэш-разделителями литералов совпадает с синтаксисом процента-р буквальным и двух Regexp объектов равны:

2.0.0-p0 :001 > /\//.source 
=> "/" 
2.0.0-p0 :002 > %r{/}.source 
=> "/" 
2.0.0-p0 :003 > /\// == %r{/} 
=> true 
+0

Да, это все. Благодаря! Вы не знаете, какая версия рубина изменила это поведение, не так ли? – pje

+0

@pje Похоже, что изменение произошло в Ruby 2.0.0-p0. –

Смежные вопросы