summaryrefslogtreecommitdiff
path: root/array.rb
diff options
context:
space:
mode:
Diffstat (limited to 'array.rb')
-rw-r--r--array.rb18
1 files changed, 18 insertions, 0 deletions
diff --git a/array.rb b/array.rb
index 81beff0b1c..93ca4f3a3e 100644
--- a/array.rb
+++ b/array.rb
@@ -283,5 +283,23 @@ class Array
alias filter select
end
end
+
+ if Primitive.rb_builtin_basic_definition_p(:find)
+ undef :find
+
+ def find(if_none_proc = nil) # :nodoc:
+ Primitive.attr! :inline_block, :c_trace
+
+ unless defined?(yield)
+ return Primitive.cexpr! 'SIZED_ENUMERATOR(self, 0, 0, ary_enum_length)'
+ end
+ _i = 0
+ value = nil
+ while Primitive.cexpr!(%q{ ary_fetch_next(self, LOCAL_PTR(_i), LOCAL_PTR(value)) })
+ return value if yield(value)
+ end
+ if_none_proc ? if_none_proc.call : nil
+ end
+ end
end
end