【问题标题】:Replace word using gsub function in ruby在 ruby​​ 中使用 gsub 函数替换单词
【发布时间】:2015-02-06 10:29:44
【问题描述】:

我正在尝试用 ruby​​ 中的 gsub 函数替换字符串中的一些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗

NoMethodError (undefined method `gsub!' for nil:NilClass):   

模型.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

another_model.rb

class Check < ActiveRecord::Base
  Test::BODY[2].gsub!("ID2", self.id).gsub!("ID3", self.name)
end

【问题讨论】:

  • 实际上,您使用 gsub 的字符串有时为零,这就是它抛出错误的原因。 Test::BODY[2] 在某些情况下具有 nil 值。
  • @Fietsband - WAY 是一个等于 2 的常数。
  • @broiSatse 嗯哎呀,错过了那部分。删除了我的评论,因为它无关紧要。

标签: ruby-on-rails ruby gsub


【解决方案1】:

啊,我找到了! gsub! 是一个很奇怪的方法。首先,它替换了字符串,所以它实际上修改了你的字符串。其次,当没有进行替换时,它返回nil。这一切都归结为您遇到的错误。

第一次执行该调用时,它会修改分配给常量的字符串,因此读取为"replace this 3 and name"。当您尝试第二次运行它时,第一个 gsub 将无法找到它正在寻找的字符串,因此将返回 nil。然后在 nil 上执行第二个 gsub。

关于如何解决它 - 这完全取决于您要达到的目标。对我来说,更改其他类常量(破坏封装)有点冒险。如果您只想在不修改原始字符串的情况下获得结果,请使用gsub(没有爆炸声)。或者更好的是,将这些字符串转换为方法并使用插值而不是替换。

【讨论】:

  • 虽然是一个很好的答案,但我不会称 gsub! 的行为很奇怪。 1.行为在documentation中有明确描述。 2. 这是一种使接收者发生变异的方法。由于这个原因,没有理由返回该对象,因为您已经拥有它。相反,它返回一个真值或假值,以向您提供有关是否进行了更改的反馈。为方便起见,将 thuthy 值设置为 self(又名接收者,又名字符串)。
【解决方案2】:

如果字符串只是模式,则应在使用前将其替换。更好的方法是字符串插值。

class Test < ActiveRecord::Base
  # Here use symbols instead, because symbols themselfs are immutable
  # so :way will always equal :way
  BODY = {
    :new => "replace this %{ID1}",
    :way => "replace this %{ID2} and %{ID3}",
    :delta => "replace this %{ID4}"
  }    
end
# HERE you should create another constant based on the 
# Test class constants
class Check < ActiveRecord::Base
  BODY = {
         :way => Test::BODY[:way] % {ID2: self.id, ID3: self.name}
  }

 # Or you can make it a method
 def self.body
   Test::BODY[:way] % {ID2: self.id, ID3: self.name}
 end
end

这将改变字符串中散列键的每一个外观

例如:

str = "%{num1} / %{num1} = 1"
str % {num1: 3} # 3 / 3 = 1

就像@BroiSatse 所说,您不应该更改其他类或同一类本身的常量,最后它们是常量。

【讨论】:

  • 谢谢@nafaa,我正在用新的源代码测试它,它的工作到目前为止
猜你喜欢
  • 1970-01-01
  • 2017-02-01
  • 2014-05-18
  • 2017-10-13
  • 1970-01-01
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
  • 2010-12-31
相关资源
最近更新 更多