如何使用sub替换'nil'值

时间:2013-07-31 11:52:04

标签: ruby string substitution

我试图使用sub替换nil值,但它没有发生。我哪里错了。

a=""
a.sub!(//,"replaced")
puts a #=> "replaced"

b=nil
b.to_s.sub!(//,"replaced")  #tried => (b.to_s).sub!(//,"replaced") but didnt work
puts b #=> nil

我错过了什么?

6 个答案:

答案 0 :(得分:3)

为了帮助您了解正在发生的事情,让我们按照您的代码声明:

a=""                       # create a new string object (the empty string), assign it to a
a.sub!(//,"replaced")      # sub! changes this very string object
puts a #=> "replaced"      # the changed string is printed

b=nil                      # we assign nil to b
b.to_s.sub!(//,"replaced") # this is actually two steps
                           # nil.to_s creates a new string object "" (the empty string)
                           # .sub! modifies that new string object in place
                           # the edited string is not assigned to anything, it will be garbage collected later
puts b #=> nil             # b is still assigned to nil

我们发现b本身永远不会被sub!更改。仅仅b.to_s返回的对象被更改(但随后被丢弃)。

答案 1 :(得分:3)

您是否尝试初始化b?惯用的Ruby初始化方法是:

b ||= "replaced"

答案 2 :(得分:2)

无论您对b.to_s做什么,它都与b不同,因此b不会被修改,并保持为最初指定的nil。< / p>

并且无法使用nilgsub!更改为字符串。该方法在String上定义,而不在NilClass上定义。但是,您只需执行b即可将b = whatever_string重新分配给字符串。

答案 3 :(得分:2)

您没有将b分配给新值“已替换”。

b = b.to_s.sub!(//,"replaced")

会帮助你,否则它会留下nil这是因为to_s提供了b对象的临时代表,因此sub!不会影响b 1}}。

证据:

s = "monkey"
s.sub!('m', 'd')
>> "donkey"

答案 4 :(得分:0)

nil并且空字符串不是同一个字符,nil不是字符串,因此它没有sub!方法。但是nil.to_s给出了空字符串,并且您的代码有效 这里很好。

irb(main):007:0> b=nil
=> nil
irb(main):008:0> b.to_s.sub!(//,"replaced")
=> "replaced"

您的代码不起作用,因为您没有将结果分配回b

b = nil
b = b.to_s.sub(//,"replaced")
puts b

你需要这样做,因为,to_s创建了b的副本,它在任何地方都没有被引用,那就是sub的字符串!变化。

另一个解决方案是检查b是否为零,并将其设置为“”:

b = "" if b.nil?

答案 5 :(得分:0)

请改用以下内容:

irb(main):006:0> b = b.to_s.sub(//, "123")
    => "123"

您使用的是哪个版本的Ruby?

顺便问一下,你能提供一些关于你正在做什么的更多细节,因为这对我来说似乎有点奇怪。也许我们会给你更合适的建议。