为什么更换不替换!对于红宝石中的字符串?

时间:2015-09-16 12:54:47

标签: ruby immutability

replace改变当前字符串而不是返回新实例。为了与Ruby中的其他方法保持一致,似乎应该调用replace!这是一个错误/不一致还是我错过了什么?

2 个答案:

答案 0 :(得分:4)

来自matz的帖子https://www.ruby-forum.com/topic/176830#773946

  爆炸(!)并不意味着“破坏性”,也不缺乏意味着非破坏性   破坏性的。爆炸标志意味着“爆炸版本更多   比非爆炸对手更危险;谨慎处理“。自从   Ruby有很多“破坏性”的方法,如果爆炸标志跟随你的话   意见,每个Ruby程序都会充满爆炸,因此很难看。

所以最初的问题来自对爆炸(!)意味着什么的误解。没有爆炸,因为只有一个replace方法才有意义,所以没有必要将它标记为“更危险”。

答案 1 :(得分:2)

没有。每当你想要一个与另一个现有字符串无关的新字符串时,从现有字符串中创建新字符串就没有意义了。例如,假设有String方法create_new_string通过使用给定参数替换内容,从现有字符串中创建新的字符串实例,如下所示:

"foo".create_new_string("bar")
# => "bar" 

很容易看出这没有意义。您可以而且应该使用字符串文字创建一个新字符串:

"bar"
# => "bar"

因此,使用String方法通过替换其内容来破坏性地创建新字符串是没有意义的;一个有意义的方法,将取代字符串的内容应破坏性地替换接收器字符串的内容,并毫不奇怪地返回该字符串。因此,不需要爆炸。

相关问题