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

时间:2014-10-23 15:57:45

标签: ruby arrays

通常,当没有进行任何修改时,对StringArrayHash等类可变的方法会返回nil。但有些Array爆炸方法,即collect!map!reverse!rotate!shuffle!sort!,{{ 1}}和sort_by!爆炸方法,即Hash,永远不会返回merge!。这背后的理由是什么?是什么让这些方法与众不同?我不知道为什么知道数组是否按nil排序是有用的,因为知道sort!数组是否唯一是有用的。

1 个答案:

答案 0 :(得分:2)

TL; DR

  

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

如果有"官方"理由(根据官方规范),我目前还没有意识到这一点。我个人怀疑它只是因为一些对象使用nil作为返回值来指示错误(例如索引超出范围)而不是引发异常,而其他对象总是返回一个有效对象。我非常怀疑那里有一个最重要的哲学,尽管在你深挖的时候似乎对何时使用爆炸方法有了普遍的共识。

Bang方法Aren本质上关于突变

作为一个例子,考虑issue #5009,请求:

  

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

一个useful response说:

  

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

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

Rubyists之间肯定有一些关于何时使用爆炸方法的共识。 Ruby Style Guide目前提供以下指南:

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

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