我知道 反向 会创建一个新字符串,其中字符串的字符反向且 反向! 将当前字符串变异(反转)到位。我的问题是,为什么,当例如测试回文时,会发生这种情况?:
a = "foobar"
a == a.reverse # => false
a == a.reverse! # => true
是因为它与内存中的对象相同,因此==只检查它们是否具有相同的内存位置?
谢谢!
答案 0 :(得分:7)
String#reverse!
方法返回调用它的字符串
a == a.reverse!
与说
相同a.reverse!
a == a
当然a == a
是真的。
请注意,至少reverse!
对字符串的作用并不重要,==
中对o == o.m
重要的是方法(m
)返回。
答案 1 :(得分:4)
a == a.reverse! # => true
是因为a.reverse!
在比较之前执行了。
a.reverse!
执行内部字符串反转。完成此操作后,a
成为一个包含raboof
的字符串。由于String#reverse!
返回了返回的结果,因此raboof
已经通过调用a
和#reverse!
更改了raboof
左侧的字符串{reverse!
正在使用#eql?
对正在呼叫true
)的右侧进行比较,结果为{{1}}。
希望它有所帮助。
答案 2 :(得分:0)
您可以对object_id进行检查,以确保!(bang)覆盖自己。
> a.object_id
=> 64561940
> a.reverse.object_id
=> 61943060
> a.reverse!.object_id
=> 64561940
答案 3 :(得分:-1)
由于String#reverse!
更改了a
变量的值,但String#reverse
返回了没有更改a
变量的新值。