为什么`gsub!`返回`nil`?

时间:2015-06-11 12:20:59

标签: ruby string gsub

我正在使用哈希地图按位置推进角色:"a""b"等等,并将元音大写。

def LetterChanges(str)
  str.to_s
  puts str
  h = ("a".."z").to_a
  i = ("b".."z").to_a.push("a")
  hash = Hash[h.zip i]
  new_str = str.downcase.gsub(/[a-z]/,hash)
  new_str.gsub!(/[aeiou]/) {|n| n.upcase }
end

LetterChanges("hello world")
LetterChanges("sentence")
LetterChanges("replace!*")
LetterChanges("coderbyte")
LetterChanges("beautiful^")
LetterChanges("oxford")
LetterChanges("123456789ae")
LetterChanges("this long cake@&")
LetterChanges("a b c dee")
LetterChanges("a confusing /:sentence:/[ this is not!!!!!!!~")

上述代码按预期工作,但示例"replace!*""123456789ae"除外,它返回nil。这是为什么?

2 个答案:

答案 0 :(得分:8)

String#gsub!修改原始字符串,如果没有执行替换,则返回该字符串或nil

String#gsub不修改原始字符串,但即使没有更改,也始终返回结果。

在方法结束时返回new_str,或使用gsub代替gsub!

这在某种程度上是Ruby中的一种模式 - 当存在多个版本的方法时,具有!的那个将修改接收者而没有方法的那个将仅返回结果。

顺便说一句,看起来你没有使用str.to_s的结果。如果你知道它是一个字符串,to_s是毫无意义的。如果它可能不是,你应该使用结果,例如:

str = str.to_s

答案 1 :(得分:2)

String#gsub!在未执行替换时返回nil

new_str.gsub!(/[aeiou]/) {|n| n.upcase }
nil不包含任何元音字母时,

会返回new_str。例如,如果str"replace!*"new_strsfqmbdf!*,则为无元音。