Feature #9347

Accept non callable argument to detect

Added by Marc-Andre Lafortune 4 months ago. Updated about 1 month ago.

[ruby-core:59482]
Status:Open
Priority:Normal
Assignee:Marc-Andre Lafortune
Category:core
Target version:current: 2.2.0

Description

Currently, the only argument that Enumerable#detect accepts is a callable object.

Shouldn't we accept non callable objects too?

[42].detect(:not_found){} # => NoMethodError: undefined method `call' for :not_found:Symbol
 # would return :not_found instead.

I'd suggest that if the given argument does not respond_to? :call, then it would be returned as is instead of raising an error as currently.
Wouldn't this be more flexible and possibly more performant?

Inspired by http://stackoverflow.com/questions/20883414/why-does-enumerabledetect-need-a-proc-lambda

History

#1 Updated by Yukihiro Matsumoto 4 months ago

I am afraid that kind of conditional behavior could error prone (e.g. accidental misbehavior when one forget having #call in argument object). I'd rather have #detect with keyword argument, like ary.detect(ifnone: :notfound).

Matz.

#2 Updated by Fuad Saud 4 months ago

I think, if it was possible, a call like this ary.detect(:sym) would make more sense by using case equality for comparison instead of #call. It would be useful with regexes for example. There's a ticket proposing this but I can't seem to find it.

#3 Updated by Marc-Andre Lafortune about 1 month ago

  • Assignee changed from Yukihiro Matsumoto to Marc-Andre Lafortune

I agree, an optional argument would be best. I'll propose a patch. Could we use if_none though?

Also available in: Atom PDF