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

Overloads:

  • #detect(ifnone = nil) {|obj| ... } ⇒ Object?

    Yields:

    • (obj)

    Returns:

  • #find(ifnone = nil) {|obj| ... } ⇒ Object?

    Yields:

    • (obj)

    Returns:



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;
}