N00b if condition quest

I'm sure theres a way, so how does one do:

if (a = b or a = c or a = d or a = f)

in a shorter, easier to view

if (a = (b c d or f)) kind of way?

···

--
Posted via http://www.ruby-forum.com/.

Hi --

···

On Fri, 27 Jul 2007, Brett Boge wrote:

I'm sure theres a way, so how does one do:

if (a = b or a = c or a = d or a = f)

in a shorter, easier to view

if (a = (b c d or f)) kind of way?

You mean == rather than = , but in any case, try this:

   if [b,c,d,f].include?(a)

David

--
* Books:
   RAILS ROUTING (new! http://www.awprofessional.com/title/0321509242\)
   RUBY FOR RAILS (http://www.manning.com/black\)
* Ruby/Rails training
     & consulting: Ruby Power and Light, LLC (http://www.rubypal.com)

case n
  when 1,2,3: puts '1-3'
  when 4..6: puts '4-6'
  else puts 'other'
end

You can, of course, use variables instead of literals, ala

case a
  when b, c, d, f
    ...
end

···

On Jul 26, 4:22 pm, Brett Boge <brett.b...@igt.com> wrote:

I'm sure theres a way, so how does one do:

if (a = b or a = c or a = d or a = f)

in a shorter, easier to view

if (a = (b c d or f)) kind of way?

== indeed.

That's gorgeous, thanks! Works brilliantly.

···

--
Posted via http://www.ruby-forum.com/.

Hi --

···

On Fri, 27 Jul 2007, Phrogz wrote:

On Jul 26, 4:22 pm, Brett Boge <brett.b...@igt.com> wrote:

I'm sure theres a way, so how does one do:

if (a = b or a = c or a = d or a = f)

in a shorter, easier to view

if (a = (b c d or f)) kind of way?

case n
when 1,2,3: puts '1-3'
when 4..6: puts '4-6'
else puts 'other'
end

You can, of course, use variables instead of literals, ala

case a
when b, c, d, f
   ...
end

That doesn't test for equality, though.

David

--
* Books:
   RAILS ROUTING (new! http://www.awprofessional.com/title/0321509242\)
   RUBY FOR RAILS (http://www.manning.com/black\)
* Ruby/Rails training
     & consulting: Ruby Power and Light, LLC (http://www.rubypal.com)

You are right for sure that OP meant ==, but let us answer the
original question too :wink:

a = [b,c,d,e,f].compact.first

Robert

···

On 7/27/07, dblack@rubypal.com <dblack@rubypal.com> wrote:

Hi --

On Fri, 27 Jul 2007, Brett Boge wrote:

> I'm sure theres a way, so how does one do:
>
> if (a = b or a = c or a = d or a = f)
>
> in a shorter, easier to view
>
> if (a = (b c d or f)) kind of way?

You mean == rather than = , but in any case, try this:

   if [b,c,d,f].include?(a)

--
[...] as simple as possible, but no simpler.
-- Attributed to Albert Einstein

On Behalf Of Brett Boge:
# == indeed.

also take a look at #any? and #all?

they come in handy in situations like,

if a < b or a < c or a < d

if a > b and a > c and a > d

sometimes, you may want a reverse to #include? behavior so that you'd like to emphasize first the element as compared to the collection. something like,

a.in?[b,c,d,f]

kind regards -botp

Robert Dober wrote:

You are right for sure that OP meant ==, but let us answer the
original question too :wink:

a = [b,c,d,e,f].compact.first

Not quite.

b=c=d=false
e=f = 99
a1 = [b,c,d,e,f].compact.first
a2=b or a2=c or a2=d or a2=e or a2=f
puts a1, a2

a1 is false and a2 is 99

Ian

···

--
Posted via http://www.ruby-forum.com/\.

An important semantic point. For example:

  case 1..3
    when 1..3: puts 'yay!'
    else puts 'boo'
  end

results in "boo", because (1..3) === (1..3) #=> false

Still, as the docs for Object#=== say:
"For class Object, effectively the same as calling #==, but typically
overridden by descendants to provide meaningful semantics in case
statements."

Numbers, strings, arrays, hashes, booleans...all these treat === as
==. I'm not arguing that they should be treated the same, or that we
should sweep the difference under the rug. I'm simply suggesting that
if you know the difference between #== and #===, particularly on the
objects that you place in your case statements, then under many
circumstances you can use a case statement as a convenience for
checking equality on many objects at once.

(Not that there was anything wrong with your initial suggestion of
Array#any?, of course.)

···

On Jul 26, 5:38 pm, dbl...@rubypal.com wrote:

On Fri, 27 Jul 2007, Phrogz wrote:
> On Jul 26, 4:22 pm, Brett Boge <brett.b...@igt.com> wrote:
>> I'm sure theres a way, so how does one do:
>> if (a = b or a = c or a = d or a = f)
>> in a shorter, easier to view
>> if (a = (b c d or f)) kind of way?

> case n
> when 1,2,3: puts '1-3'
> when 4..6: puts '4-6'
> else puts 'other'
> end
That doesn't test for equality, though.

Your solution forces the evaluation of b/c/d/e/f, which the OP's does
not (thanks to the miracle of short-circuit boolean evaluation). I
think the 'correct' answer to the typo-incorrect question is:

  if a = (b or c or d or f)

To be super clear: this is only because we're talking about assignment
instead of an actual equality test.

···

On Jul 27, 4:43 am, "Robert Dober" <robert.do...@gmail.com> wrote:

On 7/27/07, dbl...@rubypal.com <dbl...@rubypal.com> wrote:
> On Fri, 27 Jul 2007, Brett Boge wrote:
> > if (a = b or a = c or a = d or a = f)
> You mean == rather than = , but in any case, try this:
You are right for sure that OP meant ==, but let us answer the
original question too :wink:

a = [b,c,d,e,f].compact.first

Robert Dober wrote:

> You are right for sure that OP meant ==, but let us answer the
> original question too :wink:
>
> a = [b,c,d,e,f].compact.first

Not quite.

b=c=d=false

indeed well,spotted, same trap than in
x ||= 42

···

On 7/27/07, Ian Whitlock <iw1junk@comcast.net> wrote:

Ian
--
Posted via http://www.ruby-forum.com/\.

--
[...] as simple as possible, but no simpler.
-- Attributed to Albert Einstein