Kevin
Kevin

Reputation: 1120

Problems with Ruby "||" "or"?

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

Answers (3)

Fab
Fab

Reputation: 665

Sometimes I use this version:

if ["password","email","personal"].include?(params[:action])
   foo
else
   don't foo
end

Upvotes: 0

glenn jackman
glenn jackman

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

polygenelubricants
polygenelubricants

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

Related Questions