是什么决定了一个可变类的爆炸方法是否返回`nil`?
通常,当没有进行修改时,对可变类,如String
, Array
或Hash
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目前提供以下指南:
- 潜在危险方法的名称……如果存在该危险方法的安全版本,则应以感叹号结尾。
- 如果可能的话,用爆炸(危险)方法定义非爆炸(安全)方法。
这些指南似乎与一般观点一致,即爆炸方法是关于调用者在选择方法或处理返回值时要小心,而不是作为返回内容的指示。