通常,当没有进行任何修改时,对String
,Array
或Hash
等类可变的方法会返回nil
。但有些Array
爆炸方法,即collect!
,map!
,reverse!
,rotate!
,shuffle!
,sort!
,{{ 1}}和sort_by!
爆炸方法,即Hash
,永远不会返回merge!
。这背后的理由是什么?是什么让这些方法与众不同?我不知道为什么知道数组是否按nil
排序是有用的,因为知道sort!
数组是否唯一是有用的。
答案 0 :(得分:2)
[b] ang方法对可变类[es]在没有修改的情况下返回nil ... [b]一些数组爆炸方法......永远不会返回nil。
如果有"官方"理由(根据官方规范),我目前还没有意识到这一点。我个人怀疑它只是因为一些对象使用nil作为返回值来指示错误(例如索引超出范围)而不是引发异常,而其他对象总是返回一个有效对象。我非常怀疑那里有一个最重要的哲学,尽管在你深挖的时候似乎对何时使用爆炸方法有了普遍的共识。
作为一个例子,考虑issue #5009,请求:
[P]租约在API中使用bang方法(以!结尾的方法)。
一个useful response说:
[爆炸是破坏性的]是关于在Ruby中使用爆炸方法的常见误解。 Bang并没有表明一种方法会改变它的接收器,只是它应该谨慎使用。
Rubyists之间肯定有一些关于何时使用爆炸方法的共识。 Ruby Style Guide目前提供以下指南:
- 如果存在该危险方法的安全版本,则可能以危险标记结尾的潜在危险方法的名称。
- 如果可能的话,用爆炸(危险)方法定义非爆炸(安全)方法。
这些指导方针似乎与一般观点一致,即爆炸方法是关于调用者在选择方法或处理返回值时要小心,而不是将爆炸作为返回内容的指示。