GSUB! На аргумент не работает - PullRequest
4 голосов
/ 08 мая 2011

Я делаю функцию, которая превращает первый аргумент в переменную PHP (я знаю, что это бесполезно), и устанавливаю его равным второму аргументу. Я пытаюсь gsub! избавиться от всех символов, которые нельзя использовать в PHP-переменной. Вот что у меня есть:

dvar = "$" + name.gsub!(/.?\/!@\#{}$%^&*()`~/, "") { |match| puts match }

У меня есть puts match, чтобы убедиться, что некоторые символы были удалены. name - это переменная, переданная в метод, для которого она и предназначена. Я получаю эту ошибку:

TypeError: can't convert nil into String
cVar at ./Web.rb:31
(root) at C:\Users\Andrew\Documents\NetBeansProjects\Web\lib\main.rb:13

Web.rb - файл, в котором находится эта строка, а main.rb - файл, вызывающий этот метод. Как я могу это исправить?

РЕДАКТИРОВАТЬ: Если я удаляю! в gsub !, он проходит, но символы не удаляются.

Ответы [ 4 ]

5 голосов
/ 08 мая 2011

Краткий ответ

Использование dvar = "$" + name.tr(".?\/!@\#{}$%^&*()``~", '')

Длинный ответ

Проблема, с которой вы сталкиваетесь, в том, что gsub! Звонок возвращается ноль. Вы не можете объединить (+) строку с нулем.

Это происходит потому, что у вас есть неправильное регулярное выражение. Вы не избегаете специальных символов регулярных выражений, таких как $, * и., Просто для начала. Кроме того, как сейчас, gsub будет соответствовать, только если ваша строка содержит все эти символы в последовательности. Вы должны использовать оператор pipe (|) для выполнения операции, подобной OR.

GSUB! также вернет ноль, если не было замен.
Смотрите документацию для gsub и gsub! здесь: http://ruby -doc.org / core / classes / String.html # M001186
Я думаю, вы должны заменить gsub! с gsub. Вам действительно нужно name изменить?

Пример:

name = "m$var.name$$"
dvar = "$" + name.gsub!(/\$|\.|\*/, "") # $ or . or *
# dvar now contains $mvarname and name is mvarname

Ваша строка исправлена:

dvar = "$" + name.gsub(/\.|\?|\/|\!|\@|\\|\#|\{|\}|\$|\%|\^|\&|\*|\(|\)|\`|\~/, "")
# some things shouldn't (or aren't needed to) be escaped, I don't remember them all right now

Как назначил J -_- L, вы могли бы также использовать класс символов ([]), что делает его немного более понятным, я думаю. Ну, так или иначе, мысленно разобрать сложно.

dvar = "$" + name.gsub(/[\.\?\/\!\@\\\#\{\}\$\%\^\&\*\(\)\`\~]/, "")

Но поскольку вы выполняете простую замену символов, лучшим методом является tr (снова напоминает J -_- L!):

dvar = "$" + name.tr(".?\/!@\#{}$%^&*()`~", '')

Намного проще читать и вносить изменения.

3 голосов
/ 08 мая 2011
  • Вы не можете применить второй параметр и блок к gsub (блок игнорируется)
  • Регулярное выражение неверно, вы забыли квадратные скобки: /[.?\/!@\#{}$%^&*() ~] / `
  • Поскольку ваше регулярное выражение неверно, оно ничего не соответствует и потому что gsub!возвращает nil, если ничего не было заменено, вы получите эту странную ошибку nil no method
  • btw: вы должны использовать gsub, а не gsub!в этом случае, потому что вы используете возвращаемое значение (а не само имя) - и ошибка не произошла бы
3 голосов
/ 08 мая 2011

я не вижу, для чего предназначен блок, просто сделайте

name = 'hello.?\/!@#$%^&*()`~hello'
dvar = "$" + name.gsub(/\.|\?|\\|\/|\!|\@|\#|\{|\}|\$|\%|\^|\&|\*|\(|\)|\`|\~/, "")
puts dvar # => "$hellohello"

или используйте [] для обозначения ИЛИ

dvar = "$" + name.gsub(/[\.\?\\\/\!\@\\\#\{\}\$\%\^\&\*\(\)\`\~]/, "")

вы должны экранировать специальные символы и затем ИЛИ их такон удалит их по отдельности, а не только в том случае, если все они найдены вместе

, также нет необходимости использовать gsub!, чтобы изменить строку на месте, используйте немутатор gsub(), так как вы назначаете его новойпеременная,

gsub! возвращает ноль, для которого оператор + не определен для строк, что дает указанную ошибку метода, о которой не упоминалось

2 голосов
/ 08 мая 2011

Кажется, объект name имеет значение nil, возможно, вы вызываете gsub! на ноль, который обычно жалуется с помощью NoMethodError: закрытый метод gusb! вызвал nilNilClass, так как я не знаю версию ruby, которую вы используете, я не уверен, что ошибка будет той же, но это хорошее место, чтобы начать смотреть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...