I often want to use
=== to match a single object on the right side against multiple objects on the left, as is used in
case-constructions, just to return a truth value, and end up writing like this:
bar # => "bar" flag1 = case bar; when "foo", "bar", "baz"; true; end # => true flag2 = case bar; when Symbol, String; true; end # => true
Kernel#case? that should work like this:
bar # => "bar" bar.case?("foo", "bar", "baz") # => true bar.case?("qux") # => false bar.case?(Symbol, String) # => true bar.case?(Array) # => false bar.case? # => false
It is similar to Rails'
in?, but it differs from it in that it uses
=== for comparison, not
Updated by sawa (Tsuyoshi Sawada) 10 months ago
osyo (manga osyo) wrote:
bar # => "bar" ["foo", "bar", "baz"].case? bar # => true ["qux"].case? bar # => false [Symbol, String].case? bar # => true [Array].case? bar # => false
What is to be evaluated is
bar, not the objects that you put in the arrays.
bar has to be the receiver. That also matches with how
case-construction works. Furthermore, having an array as in your proposal requires additional array to be created, which will be immediately disposed.
Updated by shevegen (Robert A. Heiler) 10 months ago
This is an interesting idea. I have not thought through all implications but not withholding
that, I like it so +1 from me. I think matz has to decide whether this may be useful. Since
I love case/when in ruby in general, any extension, even secondary ideas, seem useful to me. :)
Although I have to admit, I am not sure if I yet had a use case as suggested by sawa, but I
still think it is a good idea.
I think whether it is on Kernel or Object or Enumerable is not the primary concern (that can
be decided anyway) - if matz is too busy right now then perhaps this could be suggested for
the next developer meeting to get more feedback.
I did not know about Rails in?, but I do not like the name "in?". I have no problem with
One possible question from the core team might be whether the use case is sufficient (for
many ruby users). I can not answer that myself, to be honest, if that question would come
up - but I still like the idea.
PS: I almost overlooked the comment by osyo; I agree, that is a different suggestion so
I was confused for a moment. The original suggestion by sawa is clearer IMO and more
appropriate (to the proposed suggestion); wording it like:
["foo", "bar", "baz"].case? bar
would be different, and is actually a bit confusing to me. So it should best be ignored;
sawa's original description is clearer and makes more sense to me, but this is just an
aside - I only was confused for a moment when I read the second code part by osyo.