Почему оператор = ~ иногда имеет побочные эффекты? - PullRequest
12 голосов
/ 25 мая 2011

Я заметил побочный эффект в Ruby / Oniguruma, который присутствует только в 1 из 4, казалось бы, эквивалентных утверждений.Почему переменная day определена в 009, но не в 003, 005 или 007?

irb(main):001:0> r = /(?<day>\d\d):(?<mon>\d\d)/
=> /(?<day>\d\d):(?<mon>\d\d)/

irb(main):002:0> r =~ "24:12"
=> 0
irb(main):003:0> day
NameError: undefined local variable or method `day' 

irb(main):004:0> "24:12" =~ r
=> 0
irb(main):005:0> day
NameError: undefined local variable or method `day'


irb(main):006:0> "24:12" =~ /(?<day>\d\d):(?<mon>\d\d)/
=> 0
irb(main):007:0> day
NameError: undefined local variable or method `day'


irb(main):008:0> /(?<day>\d\d):(?<mon>\d\d)/ =~ "24:12"
=> 0
irb(main):009:0> day
=> "24"

nb # 1: это то же регулярное выражение и та же строка ввсе четыре случая.

nb # 2: я проверил поведение в MS Windows и Ubuntu Linux.

Ответы [ 2 ]

13 голосов
/ 25 мая 2011

Когда вы звоните "24:12" =~ r, вы на самом деле звоните "24:12".=~(r). Итак, String # = ~ просто возвращает позицию, с которой начинается совпадение, или ноль, если совпадения нет.

Но когда вы звоните /(?<day>\d\d):(?<mon>\d\d)/ =~ "24:12", вы на самом деле звоните Regexp # = ~

И как сказано в документации

Если = ~ используется с литералом регулярного выражения с именованными захватами, захваченными строками (или ноль) назначается местному переменные, названные именами захвата.

а как же 003:

Назначение не происходит, если регулярное выражение не является литералом.

   re = /(?<lhs>\w+)\s*=\s*(?<rhs>\w+)/
   re =~ "  x = y  "
   p lhs    # undefined local variable
   p rhs    # undefined local variable

и

Назначение не происходит, если Регулярное выражение находится справа.
"х = у" = ~ /(?<lhs>\w+)\s*=\s*(?<rhs>\w+)/
п lhs, rhs # неопределенная локальная переменная

1 голос
/ 25 мая 2011

Я считаю, что 003 не поддерживается, потому что это полноценный объект Regexp в Rubyland на тот момент, возможно с переопределенными методами и тому подобным.Это значительно усложняет задачу назначенных местных жителей.

...