ruby - 订阅!论证无效

标签 ruby

我正在创建一个函数,将第一个参数转换为 PHP var(我知道没用),并将其设置为等于第二个参数。我正在尝试 gsub! 它以摆脱所有不能在 PHP var 中使用的字符。这是我所拥有的:

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

I have the puts match there to make sure some of the characters were removed. name is a variable passed into a method in which this is its purpose. I am getting this error:

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! 中,它会通过,但不会删除字符。

最佳答案

简答

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

长答案

您面临的问题是 gsub!调用返回零。您不能将 (+) 字符串与 nil 连接起来。

发生这种情况是因为您的正则表达式格式不正确。您并没有转义特殊的正则表达式符号,例如 $、* 和 .,只是为了开始。此外,按照现在的方式,gsub 仅在您的字符串包含所有这些符号的顺序时才会匹配。您应该使用管道 (|) 运算符来进行类似或的操作。

订阅!如果没有发生替换,也将返回 nil。
请参阅 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(".?\/!@\#{}$%^&*()`~", '')

更容易阅读和修改。

关于ruby - 订阅!论证无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5924757/

相关文章:

ruby-on-rails - 从方法返回的对象的索引方法-Elasticsearch

java - 一种 "Products"的推荐引擎

ruby-on-rails - 如何在 Rails 3 中为社交网络应用程序实现友谊模型?

ruby-on-rails - 如何使用延迟加载程序捕获 Capybara Feature JS 测试的服务器端错误?

ruby - 为什么 Enumerable 在 Ruby 中没有长度属性?

ruby - 本地跳转错误: no block given

ruby - 类完全加载后运行代码

ruby - Sinatra 的命令行参数

ruby-on-rails - 点击 Print 给出一个屏幕截图以保存在 rails3 中

ruby-on-rails - 使用 Rails 中的 mailman gem 接收来自多个帐户的电子邮件