Method: Enumerable#detect
- Defined in:
- enum.c
#detect(ifnone = nil) {|obj| ... } ⇒ Object? #find(ifnone = nil) {|obj| ... } ⇒ Object? #detect(ifnone = nil) ⇒ Object #find(ifnone = nil) ⇒ Object
Passes each entry in enum to block. Returns the first for which block is not false. If no object matches, calls ifnone and returns its result when it is specified, or returns nil otherwise.
If no block is given, an enumerator is returned instead.
(1..10).detect { |i| i % 5 == 0 and i % 7 == 0 } #=> nil
(1..100).find { |i| i % 5 == 0 and i % 7 == 0 } #=> 35
211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 |
# File 'enum.c', line 211 static VALUE enum_find(int argc, VALUE *argv, VALUE obj) { NODE *memo; VALUE if_none; rb_scan_args(argc, argv, "01", &if_none); RETURN_ENUMERATOR(obj, argc, argv); memo = NEW_MEMO(Qundef, 0, 0); rb_block_call(obj, id_each, 0, 0, find_i, (VALUE)memo); if (memo->u3.cnt) { return memo->u1.value; } if (!NIL_P(if_none)) { return rb_funcall(if_none, id_call, 0, 0); } return Qnil; } |