Werid, одно и то же выражение дает другое значение при исключении два раза в IRB - PullRequest
4 голосов
/ 30 сентября 2010
irb(main):051:0> "ts_id < what".gsub(/(=|<|>)\s?(\w+|\?)/,"#{$1} ?")  
=> "ts_id > ?"
irb(main):052:0> "ts_id < what".gsub(/(=|<|>)\s?(\w+|\?)/,"#{$1} ?")
=> "ts_id < ?"

Может ли кто-нибудь просветить меня?

Ответы [ 2 ]

5 голосов
/ 30 сентября 2010

Проблема в том, что переменная $1 интерполируется в строку аргумента до запуска gsub, что означает, что предыдущее значение $1 соответствует символу заменяется на. Вы можете заменить второй аргумент на '\1 ?', чтобы получить ожидаемый эффект.

2 голосов
/ 30 сентября 2010
irb(main):001:0>  "ts_id < what".gsub(/(=|<|>)\s?(\w+|\?)/,"#{$1} ?")
=> "ts_id  ?"
irb(main):002:0>  "ts_id < what".gsub(/(=|<|>)\s?(\w+|\?)/,"#{$1} ?")
=> "ts_id < ?"

Обратите внимание, что я использовал только что запущенный irb, где $1 было nil. Это все из-за того, что при использовании .gsub(...,..$1..), при расчете "части справа от ," $1 еще не генерируется "левой частью из ,".

Так сделайте это:

irb(main):001:0> "ts_id < what".gsub(/(=|<|>)\s?(\w+|\?)/,'\1 ?')
=> "ts_id < ?"

Или это:

irb(main):001:0> "ts_id < what".gsub(/(=|<|>)\s?(\w+|\?)/){"#{$1} ?"}
=> "ts_id < ?"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...