Если я хочу написать простое регулярное выражение в рубине, чтобы соответствовать только косую черту (/
, 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.==
бормочет что-то о «наборах символов» и «шаблон» нуждающейся быть такой же, но услужливо не упоминает, что такое «наборы символов» и "шаблон".
В Ruby 2.2.1 '/ \ // ==% r {/}' приводит к 'true'. Хэши тоже совпадают. –
@PhilipHallstrom: Ах, да. Хороший звонок. Я тестировал их под 1.9.3 – pje