Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Problems with Ruby "||" "or"?

Tags:

ruby

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?

like image 269
Kevin Avatar asked Jun 24 '26 10:06

Kevin


2 Answers

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.

like image 87
polygenelubricants Avatar answered Jun 26 '26 03:06

polygenelubricants


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
like image 28
glenn jackman Avatar answered Jun 26 '26 02:06

glenn jackman



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!