dja*_*ngo 5 ruby ruby-on-rails gsub
我试图用ruby中的gsub函数替换字符串中的某些单词,但有时这样可以正常工作并且在某些情况下会出现此错误?这种格式有什么问题吗?
NoMethodError (undefined method `gsub!' for nil:NilClass):
Run Code Online (Sandbox Code Playgroud)
model.rb
class Test < ActiveRecord::Base
NEW = 1
WAY = 2
DELTA = 3
BODY = {
NEW => "replace this ID1",
WAY => "replace this ID2 and ID3",
DELTA => "replace this ID4"
}
end
Run Code Online (Sandbox Code Playgroud)
another_model.rb
class Check < ActiveRecord::Base
Test::BODY[2].gsub!("ID2", self.id).gsub!("ID3", self.name)
end
Run Code Online (Sandbox Code Playgroud)
啊,我找到了!gsub!是一个非常奇怪的方法.首先,它替换了字符串,因此它实际上修改了你的字符串.其次,它nil在没有替换时返回.这一切都归结为你得到的错误.
第一次执行该调用时,它会修改分配给常量的字符串,因此它将显示为"replace this 3 and name".当您尝试再次运行它时,第一次gsub将无法找到它正在查找的字符串,因此将返回nil.然后第二个gsub在零上执行.
关于如何解决它 - 这一切都取决于你想要实现的目标.对我来说,改变其他类常量(打破封装)有些冒险.如果您只想在不修改原始字符串的情况下获得结果,请使用gsub(no bang).或者甚至更好,将这些字符串转换为方法并使用插值而不是替换.
| 归档时间: |
|
| 查看次数: |
843 次 |
| 最近记录: |