Forum: Ruby What does this do? :

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
1df9fc8ddf084661265bbae74a8d0b43?d=identicon&s=25 jko170 (Guest)
on 2007-03-15 15:50
(Received via mailing list)
Looking at this piece of code, what does the colon do?

def partner_to(user)
    raise ArgumentError unless user
    user.id == recipient_id ? sender : recipient
 end

I got the code from this rails post:
http://groups.google.com/group/rubyonrails-talk/br...

I'm just asking because I've never seen the colon used before.
C40020a47c6b625af6422b5b1302abaf?d=identicon&s=25 Stefano Crocco (crocco)
on 2007-03-15 15:55
(Received via mailing list)
Alle giovedì 15 marzo 2007, jko170 ha scritto:
>
> I'm just asking because I've never seen the colon used before.

This is a shortcut for
if user.id == recipient_id ? then sender
else recipient
end

What comes before the ? is the condition (not to confuse with the ?
which ends
the name of predicate methods: array.empty? do_something :
do_something_else
won't work, array.empty? ? do_something : do_something_else will), after
the ? and before the : there's the action to take if the condition is
true
and after the : what to do if it's false.

Stefano
1648e4f15ccee7dc3713640929ba5c01?d=identicon&s=25 Sharad Gupta (Guest)
on 2007-03-15 15:57
(Received via mailing list)
You have to see the statement in its entirety. Its centered around the
ternary operator ?:

What the code is doing is:
if (user.id == recipient_id) {
  sender
} else {
  recipient
}
1c0cd550766a3ee3e4a9c495926e4603?d=identicon&s=25 John Joyce (Guest)
on 2007-03-15 16:11
(Received via mailing list)
Looks like a ternary operator  (you know binary and unary operators,
this is the only ternary I've ever seen)
exists in C and C like languages such as PHP

conditional_statement ? true_result : false_result


if ()
a
else
b

written as
if_condition ? result_a : result_b

one of the less lovely things to read in C like languages, but after
you get used to it, it is actally a space saver.
It is relly just an conditional with two possible outcomes

Looks llike the code first checks to see if the user exists, if the
user doesn't exist, you get an error message of some sort.
after that, user.id is compared to recipient_id
if they're the same, sender, else recipient

what it's for? who knows.
some kind of validation and direction.
B33ea5c12d767bfd1253940a960274f5?d=identicon&s=25 Tim Hunter (timhunter)
on 2007-03-15 16:35
John Joyce wrote:
 > one of the less lovely things to read in C like languages, but after
> you get used to it, it is actally a space saver.
> It is relly just an conditional with two possible outcomes

In C the ?: operator is useful when writing macros since it's an
expression, as opposed to if/then, which is a statement. (Unlike Ruby.)
The ?: operator has been terribly abused, though, by people who believe
that you can make a program run faster by taking out whitespace.
1c0cd550766a3ee3e4a9c495926e4603?d=identicon&s=25 John Joyce (Guest)
on 2007-03-15 16:42
(Received via mailing list)
like I said it is often a difficult to read, not good choice.
It is better to just type a little bit more and make a proper
conditional construct in most cases.
E0d864d9677f3c1482a20152b7cac0e2?d=identicon&s=25 Robert Klemme (Guest)
on 2007-03-15 16:46
(Received via mailing list)
On 15.03.2007 15:54, Stefano Crocco wrote:
>> dde9b97ffc/6112294580b9e0ce?lnk=gst&q=internal+mail&rnum=1#6112294580b9e0ce
>>
>> I'm just asking because I've never seen the colon used before.
>
> This is a shortcut for
> if user.id == recipient_id ? then sender
> else recipient
> end

You got a question mark too much in there. :-)

> What comes before the ? is the condition (not to confuse with the ? which ends
> the name of predicate methods: array.empty? do_something : do_something_else
> won't work, array.empty? ? do_something : do_something_else will), after
> the ? and before the : there's the action to take if the condition is true
> and after the : what to do if it's false.

Yes.

  robert
Cdac1bce4ec96619cde73d2f2be4e66d?d=identicon&s=25 David Kastrup (Guest)
on 2007-03-15 16:55
(Received via mailing list)
Tim Hunter <rmagick@gmail.com> writes:

> John Joyce wrote:
>  > one of the less lovely things to read in C like languages, but after
>> you get used to it, it is actally a space saver.
>> It is relly just an conditional with two possible outcomes
>
> In C the ?: operator is useful when writing macros since it's an
> expression, as opposed to if/then, which is a statement. (Unlike
> Ruby.)  The ?: operator has been terribly abused, though, by people
> who believe that you can make a program run faster by taking out
> whitespace.

In effect, you are saying that ?: is the wrong way to fix a defect in
the language.

By the way, you can do something like

#include <stdio.h>
#define abs(x) ({typeof(x) _x = x; if (_x<0) _x = -_x; _x;})
int main() {
  printf("%d %f\n", abs(5), abs(-7.3));
  return 0;
}

with GCC (the obvious simplification using if/else as the last thing
in the block does _not_ work, however).
1df9fc8ddf084661265bbae74a8d0b43?d=identicon&s=25 jko170 (Guest)
on 2007-03-15 20:36
(Received via mailing list)
Great explanations! Thanks guys.
This topic is locked and can not be replied to.