Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何确定可变类上的bang方法是否返回“nil”?_Ruby_Arrays - Fatal编程技术网

Ruby 如何确定可变类上的bang方法是否返回“nil”?

Ruby 如何确定可变类上的bang方法是否返回“nil”?,ruby,arrays,Ruby,Arrays,通常,在不进行任何修改的情况下,对可变类(如String、Array或Hash返回nil)使用bang方法。但是一些Arraybang方法,即collect,地图,反向,旋转,洗牌,排序,排序依据和散列bang方法,即合并,从不返回nil。这背后的理由是什么?是什么使这些方法与其他方法不同?我不明白为什么要知道数组是否按sort排序没有用处很有用。TL;博士 [B] 可变类[es]上的ang方法在未进行修改时返回nil…[B]但某些数组bang方法…从不返回nil 如果有“官方”的理由(按照官方

通常,在不进行任何修改的情况下,对可变类(如
String
Array
Hash
返回
nil
)使用bang方法。但是一些
Array
bang方法,即
collect
地图
反向
旋转
洗牌
排序
排序依据
散列
bang方法,即
合并
,从不返回
nil
。这背后的理由是什么?是什么使这些方法与其他方法不同?我不明白为什么要知道数组是否按
sort排序uniq唯一时,code>没有用处很有用。

TL;博士 [B] 可变类[es]上的ang方法在未进行修改时返回nil…[B]但某些数组bang方法…从不返回nil

如果有“官方”的理由(按照官方规范),我目前还不知道。我个人怀疑这仅仅是因为一些对象使用nil作为返回值来指示错误(例如索引超出范围),而不是引发异常,而其他对象总是返回有效对象。我非常怀疑那里是否有一个压倒一切的哲学,尽管当你挖掘得足够深入时,对于何时使用bang方法似乎有一个普遍的共识

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

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

[P] 请在API中始终如一地使用bang方法(以!)

有人说:

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

关于Bang方法的一些社区共识 关于何时使用bang方法,红宝石学家们肯定有一些共识。目前,该指南提供了以下指南:

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

这些指导原则似乎与bang方法的一般思想一致,即调用方在选择方法或处理返回值时要谨慎,而不是将bang作为返回内容的指示器。

对于列出的bang方法,除了排序和合并之外,都会进行修改,因此,似乎您的问题最好只针对可能不会进行修改的方法。这还取决于您所说的“修改”是什么意思,因为即使写入相同的值,写入操作也会一直发生。@DaveNewton所有这些操作都可能不会更改接收器。对于
收集
地图,如果块是
{e|e%3}
,并且元素是数字,则它可能不会更改<代码>反向1
或对称时,code>不会改变<代码>旋转不会更改<代码>洗牌可能不会更改。对于修改,我指的是至少一个元素的变化。这就是为什么我说它取决于你所说的“修改”是什么意思。就我个人而言,我怀疑我的原因是什么。除了第一个来源信息以外的任何信息都将是意见。为什么这不是第一个来源信息的副本?看起来差不多一样。@engineersmnky From
是[sic]ruby。。。到这个方法什么都没用,我已经知道了。从本质上说,在这个实现中是无用的。。。直到你的评论结束,我无法理解。但我的印象是,你在看我所问问题的补充。我在问,如果这些方法返回
nil
,为什么它们没有用处。您正在回答为什么其他方法在返回
nil
时有用,我已经知道了。