I am looking for a more elegant way of concatenating strings in Ruby.
I have the following line:
source = \"#{ROOT_DIR}/\" << project <<
I'd prefer using Pathname:
require 'pathname' # pathname is in stdlib
Pathname(ROOT_DIR) + project + 'App.config'
about << and + from ruby docs:
+: Returns a new String containing other_str concatenated to str
<<: Concatenates the given object to str. If the object is a Fixnum between 0 and 255, it is converted to a character before concatenation.
so difference is in what becomes to first operand (<< makes changes in place, + returns new string so it is memory heavier) and what will be if first operand is Fixnum (<< will add as if it was character with code equal to that number, + will raise error)
For your particular case you could also use Array#join when constructing file path type of string:
string = [ROOT_DIR, project, 'App.config'].join('/')]
This has a pleasant side effect of automatically converting different types to string:
['foo', :bar, 1].join('/')
=>"foo/bar/1"
If you are just concatenating paths you can use Ruby's own File.join method.
source = File.join(ROOT_DIR, project, 'App.config')
You can also use % as follows:
source = "#{ROOT_DIR}/%s/App.config" % project
This approach works with ' (single) quotation mark as well.