是什么决定了一个可变类的爆炸方法是否返回`nil`?

通常,当没有进行修改时,对可变类,如StringArrayHash bang方法返回nil 。 但有些Array爆炸方法,即collect!map!reverse!rotate!shuffle! sort!sort_by!Hash爆炸方法,即merge! ,永远不会返回nil 。 这背后的理由是什么? 是什么让这些方法与众不同? 我不明白为什么知道数组是否按sort! 知道uniq!是否使数组成为唯一数据时没有用uniq! 很有用。

TL; DR

[B]对可变类[es]的ang方法在没有修改时返回nil … [b]一些数组爆炸方法……永远不会返回nil。

如果存在“官方”理由(按照官方规范的说法),我目前还没有意识到这一点。 我个人怀疑这只是因为一些对象使用nil作为返回值来指示错误(例如索引超出范围)而不是引发exception,而其他对象总是返回一个有效对象。 我非常怀疑那里有一个压倒一切的哲学,尽管当你深入挖掘时,似乎已经普遍认为何时使用爆炸方法。

Bang方法本质上不是关于突变

举个例子,考虑问题#5009 ,它要求:

[P]租约在API中使用bang方法(以!结尾的方法)。

一个有用的回应说:

[爆炸是破坏性的]是关于在Ruby中使用爆炸方法的常见误解。 Bang并没有表明方法会改变它的接收器,只是它应该谨慎使用。

关于Bang方法的一些社区共识

Rubyists之间肯定会就何时使用爆炸方法达成共识。 Ruby Style Guide目前提供以下指南:

  • 潜在危险方法的名称……如果存在该危险方法的安全版本,则应以感叹号结尾。
  • 如果可能的话,用爆炸(危险)方法定义非爆炸(安全)方法。

这些指南似乎与一般观点一致,即爆炸方法是关于调用者在选择方法或处理返回值时要小心,而不是作为返回内容的指示。