[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

String Concatenation and Implicit Object Creation

pachl

2/19/2008 11:27:00 PM

Do adjacent strings or strings separated by backslash and a newline
create multiple String objects?

For example:

s1 = 'asdf' 'qwer'

s2 = 'asdf' 'qwer'

I don't know how to figure this out, but I ran benchmarks and compared
against '<<' and '+' and it looks like each example above only creates
a single String object. What's really happening?

-pachl
6 Answers

Tim Hunter

2/19/2008 11:46:00 PM

0

pachl wrote:
> Do adjacent strings or strings separated by backslash and a newline
> create multiple String objects?
>
> For example:
>
> s1 = 'asdf' 'qwer'
>
> s2 = 'asdf'> 'qwer'
>
> I don't know how to figure this out, but I ran benchmarks and compared
> against '<<' and '+' and it looks like each example above only creates
> a single String object. What's really happening?
>
> -pachl
>

The string concatenation method is "+"

s1 = "asdf" + "qwer"

This creates 3 string objects, "asdf", "qwer", and "asdfqwer".

--
RMagick: http://rmagick.ruby...
RMagick 2: http://rmagick.ruby...rmagick2.html

pachl

2/20/2008 12:31:00 AM

0

On Feb 19, 4:45 pm, Tim Hunter <TimHun...@nc.rr.com> wrote:
> pachl wrote:
> > Do adjacent strings or strings separated by backslash and a newline
> > create multiple String objects?
>
> > For example:
>
> > s1 = 'asdf' 'qwer'
>
> > s2 = 'asdf'> > 'qwer'
>
> > I don't know how to figure this out, but I ran benchmarks and compared
> > against '<<' and '+' and it looks like each example above only creates
> > a single String object. What's really happening?
>
> > -pachl
>
> The string concatenation method is "+"
>
> s1 = "asdf" + "qwer"
>
> This creates 3 string objects, "asdf", "qwer", and "asdfqwer".

Of course it does, that's not my question.

Anyway, going off your reply, how many strings does the following
create?

s1 = 'asdf' 'qwer'

John Barnette

2/20/2008 12:48:00 AM

0

On Feb 19, 2008 4:35 PM, pachl <clintpachl@gmail.com> wrote:
> [snip] how many strings does the following create?
>
> s1 = 'asdf' 'qwer'

One. Adjacent strings are concatenated by the parser.


~ j.

Tim Hunter

2/20/2008 1:04:00 AM

0

pachl wrote:
>
> Of course it does, that's not my question.
>
> Anyway, going off your reply, how many strings does the following
> create?
>
> s1 = 'asdf' 'qwer'
>

Son-of-a-gun! Ruby *does* concatenate adjacent string literals. I learn
something every day.

My new copy of _The_Ruby_Programming_Language_ says that Ruby
concatenates adjacent string literals during the parsing process. That
makes me think that there's only 1 string created, "asdfqwer".

--
RMagick: http://rmagick.ruby...
RMagick 2: http://rmagick.ruby...rmagick2.html

botp

2/20/2008 1:27:00 AM

0

From: pachl [mailto:clintpachl@gmail.com]
# Do adjacent strings or strings separated by backslash and a newline
# create multiple String objects?

iianm, no. you create just one string literal, ergo one string object.
it's part of ruby syntax on string literals. very useful if you want
to emphasize a string part, similar to numeric literals where you can
put underscore to separate some digits...

# For example:

s1 = 'asdf' 'qwer'
#=> "asdfqwer" # here string literal processing continues

s2 = 'asdf' 'qwer'
#=> "asdfqwer" # here too

s1 = 'asdf' 'qwer' "#{s2}" # still inline works
#=> "asdfqwerasdfqwer"


s1 = 'asdf' 'qwer' s2 # this one errs, ruby expect all literals
SyntaxError: compile error
(irb):13: syntax error, unexpected tIDENTIFIER, expecting $end
from (irb):13
from :0

s1 = 'asdf' + 'qwer' + s2
#=> "asdfqwerasdfqwer"

it may look like concat op,

s1 = 'asdf' 'qwer' + s2
#=> "asdfqwerasdfqwer"

but...

s1 = 'asdf' ('qwer' + s2)
SyntaxError: compile error
(irb):17: syntax error, unexpected '(', expecting $end
s1 = 'asdf' ('qwer' + s2)
^
from (irb):17
from :0

s1 = ('asdf' 'qwer') + s2
#=> "asdfqwerasdfqwer"

kind regards -botp

pachl

2/20/2008 3:56:00 AM

0

On Feb 19, 6:26 pm, botp <botp...@gmail.com> wrote:
> From: pachl [mailto:clintpa...@gmail.com]
> # Do adjacent strings or strings separated by backslash and a newline
> # create multiple String objects?
>
> iianm, no. you create just one string literal, ergo one string object.
> it's part of ruby syntax on string literals. very useful if you want
> to emphasize a string part, similar to numeric literals where you can
> put underscore to separate some digits...
>
> # For example:
>
> s1 = 'asdf' 'qwer'
> #=> "asdfqwer" # here string literal processing continues
>
> s2 = 'asdf'> 'qwer'
> #=> "asdfqwer" # here too
>
> s1 = 'asdf' 'qwer' "#{s2}" # still inline works
> #=> "asdfqwerasdfqwer"
>
> s1 = 'asdf' 'qwer' s2 # this one errs, ruby expect all literals
> SyntaxError: compile error
> (irb):13: syntax error, unexpected tIDENTIFIER, expecting $end
> from (irb):13
> from :0
>
> s1 = 'asdf' + 'qwer' + s2
> #=> "asdfqwerasdfqwer"
>
> it may look like concat op,
>
> s1 = 'asdf' 'qwer' + s2
> #=> "asdfqwerasdfqwer"
>
> but...
>
> s1 = 'asdf' ('qwer' + s2)
> SyntaxError: compile error
> (irb):17: syntax error, unexpected '(', expecting $end
> s1 = 'asdf' ('qwer' + s2)
> ^
> from (irb):17
> from :0
>
> s1 = ('asdf' 'qwer') + s2
> #=> "asdfqwerasdfqwer"
>

Thanks everyone. This answered my question. It makes total sense that
the parser would take care of this adjacent string concatenation.

I was creating long SQL strings and to make the code readable, I was
splitting the query string among multiple lines and joining them using
the '<<' operator.

sql = 'select * from table ' <<
'where id=3 ' <<
'order by id'

Now I can go refactor my code and avoid the unnecessary overhead of
string appending/concatenating.

-pachl