Re: [Rails] String concatetenation.. + vs <<

43 views
Skip to first unread message

Colin Law

unread,
Mar 16, 2014, 4:54:06 AM3/16/14
to rubyonra...@googlegroups.com
On 16 March 2014 04:46, Brandon <wong...@gmail.com> wrote:
> So I have the following:
>
> flash[:success] = 'Your payment has completed. Please contact ' +
> @order.seller.name + ' (mobile: ' +
> @order.seller.mobile_number + ', email: ' +
> @order.seller.email + ')'
>
> Strangely inside this method, I can't seem to do string interpolation and it
> prints '@order.seller.name'. So that is a strange issue.
>
> But the main thing that puzzles me is should I be replacing + with << here?
> I read somewhere the performance is better but I really hate seeing << in my
> code. It just seems ugly and raises my blood pressure for some reason.

I think this would be much more readable
flash[:success] = "Your payment has completed. Please contact
#{@order.seller.name} (mobile: #{@order.seller.mobile_number}, email:
#{@order.seller.email} )"

Colin

Gustavo Caso

unread,
Mar 18, 2014, 5:11:58 AM3/18/14
to rubyonra...@googlegroups.com
That s really odd, I think that writing like:  flash[:success] = "Your payment has completed. Please contact #{@order.seller.name}  (mobile: #{@order.seller.mobile_number}, email: 
#{@order.seller.email} )" should interpolate it.
The only rule I know is that double quotes are the ones to use in string interpolation.
I hope you found the solution.
And please if you find it share it.

Rafael Belo

unread,
Mar 19, 2014, 9:17:28 AM3/19/14
to rubyonra...@googlegroups.com
The operator << is better to add info into a variable.
For example:

name = ""
name.object_id
=> 70341910843080

name << "Jhon "
name.object_id
=> 70341910843080

name << "Doe "
name.object_id
=> 70341910843080

Note that the object_id is always the same.
It's not create a new object.

Now, let see this:
name = ""
name.object_id
=> 70341910594080

name += "John"
name.object_id
=> 70341910549640

name += " Doe"
name.object_id
=> 70341910514060

Note that always a new object will be created. 

But if you wanna put a String with interpolation into a variable, how this:
flash[:success] = "Your payment has completed. Please contact #{@order.seller.name}  (mobile: #{@order.seller.mobile_number}, email: 
#{@order.seller.email} )"

I'll do the same way that you, because I lost just a little performance, but my code would be cleaner.

Or you prefer:
flash[:success] = "Your payment has completed. Please contact "
flash[:success] << @order.seller.name
flash[:success] << "(mobile: "
flash[:success] << @order.seller.mobile_number
flash[:success] << ", email: "
flash[:success] << @order.seller.email
flash[:success] << ")"

flash[:success]

rsrs... Ruby is clean man. Your interpolation is the better way.
Reply all
Reply to author
Forward
0 new messages