Ruby 有可能被误用的 Enumerable#one?

skandhas · 2012年03月07日 · 最后由 skandhas 回复于 2012年03月07日 · 3513 次阅读

之所以说容易被误用,是因为one? 这个方法名容易被误解成: "在一个 collection 中,只存在一个元素时则返回 ture"。 而实际含义是: "在一个 collection 中,只存在一个不是 false 或 nil 的元素时则返回 true"

在某些场合,如果要判断一个 collection 的元素个数是否为 1 时,请使用 collection 的 length 或 size 方法,而不是使用 one? 。如果是只判断非 false(nil) 的元素个数是否为 1 时,则用 one?

[1,2,3].one?         # => false
[1].one?             # => true

[false,nil,1].one?   # => true
[false,nil,1].length # => 3

DHH 的 Jbuilder 的 Pull Request: https://github.com/rails/jbuilder/pull/21

谢谢分享,以前从不用 Enumerable#one? 方法,所以对这个方法不甚了解。 每次需要判断数组元素个数的时候,一直使用 #size 方法,而判断非 false(nil) 的时候,总是去 each 递归查找一遍。

用 size 比用 length 快 0.000001 秒,因为 . 和 l 都在右手区域,而 s 在左手区。

#2 楼 @huobazi 这个我真笑了

#2 楼 @huobazi 我觉得 size 比 length 快 0.000001 秒,因为 size 比 length 少输入两个字母

#5 楼 @HungYuHei 那咱俩加起来就快 0.000002 秒了 哈哈 :D

#1 楼 @lgn21st 我曾经是想当然的误用过 one?, 直到看 api 文档的时候才发现不是那么回事 :>

#5 楼 @HungYuHei #6 楼 @huobazi 这楼歪的 哈哈:>

需要 登录 后方可回复, 如果你还没有账号请 注册新账号