0

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

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

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

看来大写了!对于单个字符来说,这有点奇怪,没有实际用途,而且有点病态的情况,对于说英语的人来说确实是违反直觉的。Tihom 指出,Ruby 优先考虑字符串不变性的其他实例更合理:

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

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

4

4 回答 4

2

阅读这篇文章,尤其是评论。

实际上,这并不是什么大问题。Ruby 对以“!”结尾的方法的约定 是该方法会做一些令人惊讶的事情。在这种情况下,大写!更改字符串实例。所以你不应该依赖返回值,也不应该在赋值中使用它。

约定是:

some_string.upcase!

所以upcase!不应该在分配中使用,因为它会更改字符串。相反,它的用途是检查诸如if str.upcase!. 一个更直观的例子是gsub!,如果没有进行替换,它返回 nil:

  "abc".gsub!('d','') #=> nil 
于 2013-10-26T20:40:26.600 回答
2

字符串#upcase!

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

'Ab'.upcase! # => "AB"
# nil returned as receiver is already upcased.
"A".upcase! # => nil 
于 2013-10-26T19:46:19.150 回答
2

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

puts 'A'.upcase
A
于 2013-10-26T19:48:23.463 回答
1

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

upcase!nil如果未进行任何更改,将返回。

于 2013-10-26T19:46:44.840 回答