Reputation: 89233
I want to test whether a
equals 1 or 2
I could do
a == 1 || a == 2
but this requires repeating a
(which would be annoying for longer variables)
I'd like to do something like a == (1 || 2)
, but obviously this won't work
I could do [1, 2].include?(a)
, which is not bad, but strikes me as a bit harder to read
Just wondering how do to this with idiomatic ruby
Upvotes: 61
Views: 31408
Reputation: 1637
Include is definitely the way to go here. 🤝
%w[cat dog].include?(type)
Upvotes: 3
Reputation: 576
You can just use intersection like
([a] & [1,2]).present?
a alternative way.
Upvotes: 5
Reputation: 6958
One way would be to petition "Matz" to add this functionality to the Ruby specification.
if input == ("quit","exit","close","cancel") then
#quit the program
end
But the case-when statement already lets you do exactly that:
case input when "quit","exit","close","cancel" then
#quit the program
end
When written on one line like that, it acts and almost looks like an if statement. Is the bottom example a good temporary substitution for the top example? You be the judge.
Upvotes: 10
Reputation: 176675
First put this somewhere:
class Either < Array
def ==(other)
self.include? other
end
end
def either(*these)
Either[*these]
end
Then, then:
if (either 1, 2) == a
puts "(i'm just having fun)"
end
Upvotes: 7
Reputation: 757
Maybe I'm being thick here, but it seems to me that:
(1..2) === a
...works.
Upvotes: -1
Reputation: 6821
I don't know in what context you're using this in, but if it fits into a switch statement you can do:
a = 1
case a
when 1, 2
puts a
end
Some other benefits is that when uses the case equality === operator, so if you want, you can override that method for different behavior. Another, is that you can also use ranges with it too if that meets your use case:
when 1..5, 7, 10
Upvotes: 12
Reputation: 132247
Your first method is idiomatic Ruby. Unfortunately Ruby doesn't have an equivalent of Python's a in [1,2]
, which I think would be nicer. Your [1,2].include? a
is the nearest alternative, and I think it's a little backwards from the most natural way.
Of course, if you use this a lot, you could do this:
class Object
def member_of? container
container.include? self
end
end
and then you can do a.member_of? [1, 2]
.
Upvotes: 39