我正在使用哈希地图按位置推进角色:"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
。这是为什么?
答案 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_str
为sfqmbdf!*
,则为无元音。