Ruby字符串upcase!方法 - uppercasechar.upcase!返回nil - bug或feature?

时间:2013-10-26 19:44:50

标签: ruby string syntax upcase

放'A'.upcase!返回零。这有点令人困惑,特别是因为'Ab'返回'AB'而不是'B'。这是一个错误还是语言怪癖?

编辑所以我看到了文档,但它似乎仍然违反直觉。什么时候在实际使用场景中有意义?我可以看到它导致的问题多于帮助

编辑 Tihom的答案似乎是最好的答案;他提到的帖子和评论让我明白,Matz和Ruby开发团队很可能是因为数据类型的完整性(字符串应该是不可变的)的一致性而不是英语口语中链式方法的敏感性

似乎是大概的!对于单个字符而言,它有点奇怪,没有实际用途,并且是一种病态案例,对于说英语的人来说确实是违反直觉的。 Tihom指出,Ruby的字符串不变性优先级的其他实例更合理:

  

更直观的例子是gsub !,如果没有进行替换,则返回nil:

     

“abc”.gsub!('d','')#=>没有

4 个答案:

答案 0 :(得分:2)

String#upcase!

  

升级str的内容,如果没有进行任何更改则返回nil。

'Ab'.upcase! # => "AB"
# nil returned as receiver is already upcased.
"A".upcase! # => nil 

答案 1 :(得分:2)

使用upcase而不是upcase!upcase!如果字符串已经大写,则返回nil):

puts 'A'.upcase
A

答案 2 :(得分:2)

阅读此post,尤其是评论。

  

实际上它不是那么多的问题。 Ruby的惯例   以'!'结尾的方法这个方法会做点什么   奇怪。在这种情况下,大写!更改String实例。   所以你不应该依赖于返回值,也不应该使用它   分配

     

惯例是:

     

some_string.upcase!

因此,upcase!不应该在赋值中使用,因为它会更改字符串。相反,用途是检查if str.upcase!之类的真相。更直观的例子是gsub!,如果没有进行替换,则返回nil:

  "abc".gsub!('d','') #=> nil 

答案 3 :(得分:1)

根据文件: http://ruby-doc.org/core-2.0.0/String.html#method-i-upcase-21

如果没有进行任何更改,

upcase!将返回nil