Reputation: 1120
Beginning Ruby Question:
I'm trying to see if a string variable's contents is either "personal" "email" or "password".
I'm trying:
if params[:action] == "password" || "email" || "personal"
foo
else
don't foo
end
But that doesn't work and returns strange results, and using IRB to play around with "or" statements I have no idea why the following happens:
irb(main):040:0> a = "email"
=> "email"
irb(main):041:0> a == "password" || "email"
=> "email"
irb(main):042:0> a == "email" || "password"
=> true
I just want something that if any of the 3 variables are true no matter what order they are in it returns true, if not it returns false. Anyone want to help this n00b out?
Upvotes: 2
Views: 178
Reputation: 665
Sometimes I use this version:
if ["password","email","personal"].include?(params[:action])
foo
else
don't foo
end
Upvotes: 0
Reputation: 246754
The case
statement is also good for matching this or that or ...
case email
when "password", "email", "whatever"
puts "found a match: #{email}"
else
puts "no match"
end
Upvotes: 5
Reputation: 383716
This specific problem will have many good solutions, but instead I will concentrate on the
boolean
logic for educational purpose
You'll want to do this:
(a == "password") || (a == "email) || (a == "password")
Programming languages aren't like English: it has a strict grammatical rule, and instead of saying:
"if x is 3 or 5"
in most programming languages, you have to say:
if x is 3 or x is 5
Similarly, where as it's common in mathematical notation to say:
"if a < b < c"
in most programming languages, you have to say:
if a < b and b < c
Let's see what happens with your experiment:
a == "password" || "email"
Due to what is called "operator precedence", this is parsed as:
(a == "password") || "email"
Now, since a == "email"
, this essentially evaluates to:
false || "email"
which is why this expression evaluates to "email"
.
Similarly, with:
a == "email" || "password"
This is essentially
true || "password"
and that's why it evaluates to true
.
Upvotes: 13