也许有人知道以下行为的技术答案:
s = "hello world!"
s == s.upcase
# =>false, because "hello world!" != "HELLO WORLD!"
s == s.upcase!
#=>true, because s is changed before comparison?
的Mathias
答案 0 :(得分:4)
这会发生在每种语言中,以这种方式来考虑
AreEqual(s, s.upcase())
vs.
AreEqual(s, s.upcase!())
在这两种情况下,upcase(!)函数在将其传递给AreEqual之前都要调用,而在upcase!()
情况下,它实际上更改了值s 。 upcase()
返回带有大写版本s的 new 字符串。
答案 1 :(得分:4)
不要那样做。
如果未进行任何更改, upcase!
会返回已更新的字符串或nil
,因此第一次之后该比较的结果将始终为false
。但是这样依赖副作用语义是一个非常糟糕的主意。