String Concatenation and Implicit Object Creation

P

pachl

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
 
T

Tim Hunter

pachl said:
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".
 
P

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'
 
T

Tim Hunter

pachl said:
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".
 
B

botp

From: pachl [mailto:[email protected]]
# 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
 
P

pachl

From: pachl [mailto:[email protected]]
# 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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,482
Members
44,900
Latest member
Nell636132

Latest Threads

Top