Краткий ответ
Использование 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(".?\/!@\#{}$%^&*()`~", '')
Намного проще читать и вносить изменения.