我试图使用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
我错过了什么?
答案 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>
并且无法使用nil
将gsub!
更改为字符串。该方法在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?
顺便问一下,你能提供一些关于你正在做什么的更多细节,因为这对我来说似乎有点奇怪。也许我们会给你更合适的建议。