Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Meaning of "<<"?

Reply
Thread Tools

Meaning of "<<"?

 
 
Chris Davies
Guest
Posts: n/a
 
      02-13-2009
Hi,

I'm currently trying to learn ruby, coming from a perl/unix
background. I've been working through one of the many online tutorials
and it's suddenly thrown in the "<<" operator.

Now, I'm familiar with a the use of "<<" as a bitwise left shift
and as a here doc, but this one throws me. The relevant URL is
http://rubylearning.com/satishtalim/...e_objects.html
and here's a variation on the theme for illustrative purposes:

str = 'one'
str << 'two'
puts str # onetwo

It seems to me that << in this context is equivalent to +=, but I can't
find any documentation explaining /why/ this is the case, and why I
should use one in preference to the other. (Google really doesn't like
"<<".)

Any suggestions, please?
Cheers,
Chris
 
Reply With Quote
 
 
 
 
saurabh purnaye
Guest
Posts: n/a
 
      02-13-2009
[Note: parts of this message were removed to make it a legal post.]

Hi Chris,
If you see the string class documentation of ruby,
http://www.ruby-doc.org/core/classes...g.html#M000822
Its for concatenation..
You may find more here http://www.ruby-doc.org/

On Fri, Feb 13, 2009 at 7:33 PM, Chris Davies <(E-Mail Removed)>wrote:

> Hi,
>
> I'm currently trying to learn ruby, coming from a perl/unix
> background. I've been working through one of the many online tutorials
> and it's suddenly thrown in the "<<" operator.
>
> Now, I'm familiar with a the use of "<<" as a bitwise left shift
> and as a here doc, but this one throws me. The relevant URL is
> http://rubylearning.com/satishtalim/...e_objects.html
> and here's a variation on the theme for illustrative purposes:
>
> str = 'one'
> str << 'two'
> puts str # onetwo
>
> It seems to me that << in this context is equivalent to +=, but I can't
> find any documentation explaining /why/ this is the case, and why I
> should use one in preference to the other. (Google really doesn't like
> "<<".)
>
> Any suggestions, please?
> Cheers,
> Chris
>
>



--
--
Thanks and Regards
Saurabh Purnaye
+91-9922071155
skype: sorab_pune
yahoo & gtalk: saurabh.purnaye
msn: http://www.velocityreviews.com/forums/(E-Mail Removed)

 
Reply With Quote
 
 
 
 
Dido Sevilla
Guest
Posts: n/a
 
      02-13-2009
Ruby is capable of doing operator overloading, and the << operator has
been consistently overloaded to do stuff like appending data (I
believe this was an idea that came from C++). Note also that use of <<
on strings is much faster than +=3D, since +=3D will create a new string,
append the string you're adding to it, and replace the old string by
the new one, while, if I'm not mistaken << will append the data on its
right side in place, if I recall correctly.

Several other classes also overload the << operator. Using << on an
array will append the right hand side to the end of the array
(equivalent to Array#push). << on an IO object will write the object
on the right hand side, converting it to a string, just as someone
coming from C++ might expect.

--=20
=E6=99=AE=E9=80=9A=E3=81=98=E3=82=83=E3=81=AA=E3=8 1=84=E3=81=AE=E3=81=8C=E5=
=BD=93=E7=84=B6=E3=81=AA=E3=82=89=E7=AD=94=E3=81=8 8=E3=82=8B=E7=A7=81=E3=81=
=AF=E4=BD=95=E3=81=8C=E3=81=A7=E3=81=8D=E3=82=8B=E F=BC=9F
=E6=99=AE=E9=80=9A=E3=81=A7=E3=82=82=E6=99=AE=E9=8 0=9A=E3=81=98=E3=82=83=E3=
=81=AA=E3=81=8F=E3=81=A6=E6=84=9F=E3=81=98=E3=82=8 B=E3=81=BE=E3=81=BE=E6=84=
=9F=E3=81=98=E3=82=8B=E3=81=93=E3=81=A8=E3=81=A0=E 3=81=91=E3=82=92=E3=81=99=
=E3=82=8B=E3=82=88=EF=BC=81
http://stormwyrm.blogspot.com

 
Reply With Quote
 
Stefano Crocco
Guest
Posts: n/a
 
      02-13-2009
Alle Friday 13 February 2009, Chris Davies ha scritto:
> Hi,
>
> I'm currently trying to learn ruby, coming from a perl/unix
> background. I've been working through one of the many online tutorials
> and it's suddenly thrown in the "<<" operator.
>
> Now, I'm familiar with a the use of "<<" as a bitwise left shift
> and as a here doc, but this one throws me. The relevant URL is
> http://rubylearning.com/satishtalim/...e_objects.html
> and here's a variation on the theme for illustrative purposes:
>
> str = 'one'
> str << 'two'
> puts str # onetwo
>
> It seems to me that << in this context is equivalent to +=, but I can't
> find any documentation explaining /why/ this is the case, and why I
> should use one in preference to the other. (Google really doesn't like
> "<<".)
>
> Any suggestions, please?
> Cheers,
> Chris


This is the documentation for the String << operator (that is, for the
String#<< method):

str << fixnum => str
str.concat(fixnum) => str
str << obj => str
str.concat(obj) => str

From Ruby 1.8
------------------------------------------------------------------------
Append---Concatenates the given object to _str_. If the object is a
+Fixnum+ between 0 and 255, it is converted to a character before
concatenation.

a = "hello "
a << "world" #=> "hello world"
a.concat(33) #=> "hello world!"

The difference between << and + is that << modifies the first string, while +
creates a new string, made of the caracters of the first string followed by
the characters of the second. Too see the difference, look at this example:

a = "first string"
b = "second string"
puts "Using +"
a + b
puts a
puts b
puts "Using <<"
a << b
puts a
puts b

The output is:

Using +
first string
second string
Using <<
first stringsecond string
second string

As you can see, in the second case, a has been modified, while in the first
case it wasn't.

In general, to obtain documentation about ruby classes and methods, you can
use the ri command:

ri 'String#<<'

which will give the documentation I posted above. There's also an online API
reference at http://www.ruby-doc.org/core/

I hope this helps

Stefano

 
Reply With Quote
 
Chris Davies
Guest
Posts: n/a
 
      02-13-2009
Chris Davies <(E-Mail Removed)> wrote:
> It seems to me that << in this context is equivalent to +=, but I can't
> find any documentation explaining /why/ this is the case [...]


Thank you all. Very enlightening.
Chris
 
Reply With Quote
 
Herman Martinelli
Guest
Posts: n/a
 
      02-13-2009
Chris Davies wrote:
> Now, I'm familiar with a the use of "<<" as a bitwise left shift
> and as a here doc, but this one throws me. [...]



Think of it as a method, not as an operator.
Every class can define a method that is called '<<'
just like any class can define a method called 'print' or 'count'.

Don't let this syntax fool you:

str = "basic"
str << "appended"

It is just a nice to read way of saying the
following, which explains it and works, too:

str = "basic"
str.<<( "appended" )

Got it?

Hrmn
 
Reply With Quote
 
Julian Leviston
Guest
Posts: n/a
 
      02-14-2009
I thought + was for concatenation. << actually modifies Its receiver

Blog: http://random8.zenunit.com/
Learn rails: http://sensei.zenunit.com/

On 14/02/2009, at 1:12 AM, saurabh purnaye <(E-Mail Removed)>
wrote:

> Hi Chris,
> If you see the string class documentation of ruby,
> http://www.ruby-doc.org/core/classes...g.html#M000822
> Its for concatenation..
> You may find more here http://www.ruby-doc.org/
>
> On Fri, Feb 13, 2009 at 7:33 PM, Chris Davies <(E-Mail Removed)
> >wrote:

>
>> Hi,
>>
>> I'm currently trying to learn ruby, coming from a perl/unix
>> background. I've been working through one of the many online
>> tutorials
>> and it's suddenly thrown in the "<<" operator.
>>
>> Now, I'm familiar with a the use of "<<" as a bitwise left shift
>> and as a here doc, but this one throws me. The relevant URL is
>> http://rubylearning.com/satishtalim/
>> mutable_and_immutable_objects.html
>> and here's a variation on the theme for illustrative purposes:
>>
>> str = 'one'
>> str << 'two'
>> puts str # onetwo
>>
>> It seems to me that << in this context is equivalent to +=, but I
>> can't
>> find any documentation explaining /why/ this is the case, and why I
>> should use one in preference to the other. (Google really doesn't
>> like
>> "<<".)
>>
>> Any suggestions, please?
>> Cheers,
>> Chris
>>
>>

>
>
> --
> --
> Thanks and Regards
> Saurabh Purnaye
> +91-9922071155
> skype: sorab_pune
> yahoo & gtalk: saurabh.purnaye
> msn: (E-Mail Removed)


 
Reply With Quote
 
Julian Leviston
Guest
Posts: n/a
 
      02-14-2009
I thought operator overloading was a non-oop way of specifying
multiple functions that each take different argument numbers? That's
not what's going on here. This is messages having the same name
exactly being sent to different classes having slightly different
meanings depending on the class of the receiver. It's encapsulation,
really... Each class encapsulates its meanings and can obviously have
different meanings for the same method names depending on the classes
in question.

Blog: http://random8.zenunit.com/
Learn rails: http://sensei.zenunit.com/

On 14/02/2009, at 1:16 AM, Dido Sevilla <(E-Mail Removed)> wrote:

> Ruby is capable of doing operator overloading, and the << operator has
> been consistently overloaded to do stuff like appending data (I
> believe this was an idea that came from C++). Note also that use of <<
> on strings is much faster than +=, since += will create a new string,
> append the string you're adding to it, and replace the old string by
> the new one, while, if I'm not mistaken << will append the data on its
> right side in place, if I recall correctly.
>
> Several other classes also overload the << operator. Using << on an
> array will append the right hand side to the end of the array
> (equivalent to Array#push). << on an IO object will write the object
> on the right hand side, converting it to a string, just as someone
> coming from C++ might expect.
>
> --
> 普通じゃないのが当然なら答える私は何ができる?
> 普通でも普通じゃなくて感じるまま感じることだけをするよ!
> http://stormwyrm.blogspot.com
>


 
Reply With Quote
 
Gary Wright
Guest
Posts: n/a
 
      02-14-2009

On Feb 14, 2009, at 12:10 AM, Julian Leviston wrote:

> I thought operator overloading was a non-oop way of specifying
> multiple functions that each take different argument numbers? That's
> not what's going on here.


Agreed. This is not 'overloading' in the C++ sense of the term.

> This is messages having the same name exactly being sent to
> different classes having slightly different meanings depending on
> the class of the receiver. It's encapsulation, really... Each class
> encapsulates its meanings and can obviously have different meanings
> for the same method names depending on the classes in question.


Disagree. Encapsulation doesn't seem like the right concept to
describe this pattern.

I think that 'abstraction' might be a better description. When the
same method provides analogous semantics across multiple classes, the
method name becomes a sigil for the abstract semantics. So '<<' is a
sigil for 'alter via concatenation' (IO, String, Array) but is also a
sigil for 'shift to the left' (Fixnum, Date, IPAddr).

The term 'protocol' is often used to describe this sort of pattern
across classes.

Good library design comes from exploiting these sorts of patterns.

Gary Wright

 
Reply With Quote
 
Chris Davies
Guest
Posts: n/a
 
      02-14-2009
Herman Martinelli <(E-Mail Removed)> wrote:
> It is just a nice to read way of saying the
> following, which explains it and works, too:


> str = "basic"
> str.<<( "appended" )


> Got it?


More syntatic sugar, like the "def instance_var=" setter method?

Thanks,
Chris
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Understanding search queries, semantics, and "Meaning" ...aren't weall looking for meaning? 5lvqbwl02@sneakemail.com Python 4 01-14-2009 02:28 PM
use work.my_package.all-->what exactly meaning of this Parthav VHDL 4 01-13-2006 07:50 PM
WHAT IS THE MEANING *FESWANY MCSE 3 01-28-2005 02:55 PM
Meaning of word "develop" in the exam (70-300) TomTom MCSD 10 08-13-2004 04:39 PM
Meaning of output value? Sander Odekerken VHDL 2 05-18-2004 05:41 PM



Advertisments