Method: Enumerable#find
- 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..100).detect #=> #<Enumerator: 1..100:detect>
(1..100).find #=> #<Enumerator: 1..100:find>
(1..10).detect { |i| i % 5 == 0 && i % 7 == 0 } #=> nil
(1..10).find { |i| i % 5 == 0 && i % 7 == 0 } #=> nil
(1..10).detect(-> {0}) { |i| i % 5 == 0 && i % 7 == 0 } #=> 0
(1..10).find(-> {0}) { |i| i % 5 == 0 && i % 7 == 0 } #=> 0
(1..100).detect { |i| i % 5 == 0 && i % 7 == 0 } #=> 35
(1..100).find { |i| i % 5 == 0 && i % 7 == 0 } #=> 35
326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 |
# File 'enum.c', line 326
static VALUE
enum_find(int argc, VALUE *argv, VALUE obj)
{
struct MEMO *memo;
VALUE if_none;
if_none = rb_check_arity(argc, 0, 1) ? argv[0] : Qnil;
RETURN_ENUMERATOR(obj, argc, argv);
memo = MEMO_NEW(Qundef, 0, 0);
rb_block_call(obj, id_each, 0, 0, find_i, (VALUE)memo);
if (memo->u3.cnt) {
return memo->v1;
}
if (!NIL_P(if_none)) {
return rb_funcallv(if_none, id_call, 0, 0);
}
return Qnil;
}
|