Ruby way to say this?

In Ruby, zero isn’t false and there is no equivalent of the ?: operator
with the middle term omitted. So e.g. I’d like to say [pseudo-code from
some other language]:

oneThing()?:otherThing()

meaning, if oneThing is nonzero, return oneThing, else return
otherThing. Now, I don’t want to evaluate oneThing twice, so I’ve ended
up with this:

(temp = oneThing()).nonzero? ? temp : otherThing()

I don’t like it. Is that culturally correct, or is there a ruby way to
speak here, that I’m not thinking of? Thx - m.

On Oct 17, 2006, at 11:15 PM, matt neuburg wrote:

In Ruby, zero isn’t false and there is no equivalent of the ?:
operator
with the middle term omitted. So e.g. I’d like to say [pseudo-code
from
some other language]:

oneThing()?:otherThing()

oneThing || otherThing

On Oct 17, 2006, at 2:21 PM, Max L. wrote:

oneThing || otherThing

You didn’t read that question all the way through. :wink:

James Edward G. II

On Oct 17, 2006, at 2:44 PM, Louis J Scoras wrote:

otherThing. Now, I don’t want to evaluate oneThing twice, so I’ve
Are you okay with adding an extra function call?
if_zero( x-=1 , 8) # => 8

So your original would look like:

if_zero(one_thing, other_thing)

If you change that to support a block, you can avoid evaluating
other_thing unless it’s needed:

def if_zero(exp)
exp.zero? ? yield : exp
end

if_zero(one_thing) { other_thing }

James Edward G. II

Max L. [email protected] wrote:

oneThing || otherThing
Please pretend I’m just staring at you waiting for you to see why that
won’t work. :slight_smile: m.

On 10/17/06, James Edward G. II [email protected] wrote:

If you change that to support a block, you can avoid evaluating
other_thing unless it’s needed:

def if_zero(exp)
exp.zero? ? yield : exp
end

if_zero(one_thing) { other_thing }

Ahh, yes. That is a nice improvement. +1

On 10/17/06, matt neuburg [email protected] wrote:

(temp = oneThing()).nonzero? ? temp : otherThing()

I don’t like it. Is that culturally correct, or is there a ruby way to
speak here, that I’m not thinking of? Thx - m.

Are you okay with adding an extra function call?

How about:

def if_zero(exp,alt)
  exp == 0 ? alt : exp
end

x = 0

if_zero( (x+=1) + 1, 7) # => 2
if_zero(  x-=1     , 8) # => 8

So your original would look like:

# if_zero(one_thing, other_thing)

matt neuburg wrote:

In Ruby, zero isn’t false and there is no equivalent of the ?: operator
with the middle term omitted. So e.g. I’d like to say [pseudo-code from
some other language]:

oneThing()?:otherThing()

meaning, if oneThing is nonzero, return oneThing, else return
otherThing. Now, I don’t want to evaluate oneThing twice, so I’ve ended
up with this:

Well, most of the time just ask ruby to do what you want:

oneThing.nonzero? || otherThing


num.nonzero? => num or nil

Returns num if num is not zero, nil otherwise. This behavior is useful
when
chaining comparisons:

a = %w( z Bb bB bb BB a aA Aa AA A )
b = a.sort {|a,b| (a.downcase <=> b.downcase).nonzero? || a <=> b }
b #=> [“A”, “a”, “AA”, “Aa”, “aA”, “BB”, “Bb”, “bB”, “bb”, “z”]

cheers

Simon

On Wed, Oct 18, 2006 at 04:55:12AM +0900, matt neuburg wrote:

Max L. [email protected] wrote:

oneThing || otherThing

Please pretend I’m just staring at you waiting for you to see why that
won’t work. :slight_smile: m.

zero is not false, so you would need

oneThing != 0 || otherThing

which, if oneThing was not equal to zero would return true, not the
value of oneThing.

On Oct 17, 2:00 pm, Simon Kröger [email protected] wrote:

Well, most of the time just ask ruby to do what you want:

oneThing.nonzero? || otherThing


num.nonzero? => num or nil

Returns num if num is not zero, nil otherwise. This behavior is useful when
chaining comparisons:

Bah! You have to come up with the easy answer and spoil all of our fun,
don’t you?

[email protected] (matt neuburg) writes:

Hi Matt,

meaning, if oneThing is nonzero, return oneThing, else return
otherThing. Now, I don’t want to evaluate oneThing twice, so I’ve
ended up with this:

(temp = oneThing()).nonzero? ? temp : otherThing()

I don’t like it. Is that culturally correct, or is there a ruby way to
speak here, that I’m not thinking of?

What about this?

one_thing.nonzero? || other_thing

Bye,
Tassilo

On Wed, 18 Oct 2006, matt neuburg wrote:

(temp = oneThing()).nonzero? ? temp : otherThing()

I don’t like it. Is that culturally correct, or is there a ruby way to
speak here, that I’m not thinking of? Thx - m.

why not write in ruby what you are saying in english?

 harp:~ > cat a.rb
 def one_thing() 0 end
 def other_thing() 1 end

 p [one_thing, other_thing].detect{|thing| not thing.zero?}

 def one_thing() 42 end
 def other_thing() 0 end

 p [one_thing, other_thing].detect{|thing| not thing.zero?}



 harp:~ > ruby a.rb
 1
 42

??

-a

Simon Kröger [email protected] wrote:

Well, most of the time just ask ruby to do what you want:

oneThing.nonzero? || otherThing


num.nonzero? => num or nil

Returns num if num is not zero, nil otherwise.

Thx, I feel better now! m.

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs