Rubyのjoinメソッドで配列から簡単に文字列をつくれるのをご存じでしょうか。Rubyには配列を操作する便利なメソッドがたくさんありますが、joinメソッドはその1つです。そして、joinメソッドをうまく使えれば、Rubyらしいシンプルで読み易いプログラムを作れるようになります。
今回は、joinメソッドを知りたい方のために、その機能と使い方を紹介します。
Rubyで文字列を連結するには
Rubyで文字列を連結するなら+演算子を使います。しかし、他にも文字列を連結する方法があるのをごぞんじでしょうか。今回紹介するjoinメソッドは、配列に格納した文字列をまとめて連結できる便利な機能です。
まずは、Rubyにおける文字列を連結する方法について紹介します。
文字列同志の足し算
Rubyで文字列を連結するのによく使われる方法が、文字列同志を+演算子で連結する方法です。
文字列 = 文字列 + 文字列
この方法は、変数を使った簡単な文字列の連結などでよく使われます。
+演算子で文字列を連結する例
name = "join" str = "私の名前は" + name + "です" p str # "私の名前はjoinです"が表示される
<<演算子を使う
<<演算子は、文字列クラスのメソッドで対象の文字列の<<演算子に続く文字列を破壊的に連結します。つまり、先ほどの+演算子と違い、元の変数を書き換えてしまうので使う際には注意が必要です。
文字列 << 連結したい文字列
<<演算子を使用した例
name = "join" str = "私の名前は" str << name str << "です" p str # "私の名前はjoinです"が表示される
配列を利用するならjoinで
先ほど紹介した+演算子と<<演算子は、連結する文字列の数が少ないケースでよく使われます。しかし、連結する文字列が多いと読み難いうえにプログラムも面倒です。そのため連結する文字列が多い場合は、対象の文字列を一旦配列に格納し、繰り返し処理でそれらを連結する方法が使われます。
なお配列を使った繰り返し処理と言えば、eachメソッドを利用した処理を思い浮かべるかもしれません。しかし、Rubyにはもっと簡単に記述できるjoinメソッドが用意されています。もし配列を利用して文字列を連結するなら、joinメソッドを利用してください。
joinメソッドを利用した例
name = "join" arr = ["私の名前は", "", "です"] arr[1] = name out = arr.join p out # "私の名前はjoinです"が表示される
また、pushメソッドを利用して配列を作り、その配列にjoinメソッドを適用して文字列を作ることも可能です。
pushメソッドとjoinメソッドを利用した例
name = "join" arr = ["問1", "の答え:" ] arr.push(name) out = arr.join p out # "問1の答え:join"が表示される
配列クラスのjoinメソッドの基本
次から配列内に格納された文字列を連結するjoinメソッドの基本的な使い方について解説します。
配列クラスのjoinメソッドの文法
joinメソッドは配列(Array)クラスに定義されており、配列を格納した変数などに対して使用し、その配列内の全ての要素を連結した文字列を返します。
基本的なjoinメソッドの使い方
(配列).join
joinメソッドの例
p ['abc', 'def', 'ghi'].join # "abcdefghi"が表示される
joinメソッドは連結文字を指定できる
先ほどの例のようにjoinメソッドのみ使用した場合、配列の要素を単純に連結するだけですが、joinメソッドでは連結文字を指定して連結することも可能です。なおその場合、引数で連結文字を指定します。
連結文字を使う場合のjoinメソッドの使い方
(変数).join(連結文字)
連結文字を使ったjoinメソッドの例
p ['abc', 'def', 'ghi'].join(',') # "abc,def,ghi"が表示される
配列の要素は数字でもOK
joinメソッドの特徴は、配列の要素が文字列でなくても自動的に文字列に変換して連結する点です。また、もし連結する要素が入れ子の配列だった場合、その配列を一旦文字列に変換してから連結します。そのため、文字列と数字などが混じっているような複雑な配列でも、全て文字列に変換して連結できます。
文字列と数字が混じった配列を連結する例
p [1, "join", "method", 0].join(',') # "1,join,method,0"が表示される
joinメソッドの応用例
Rubyにはjoinメソッドの他にも配列で使える便利なメソッドがたくさんあります。次からそのような便利な配列クラスのメソッドの1つ、mapメソッドとjoinメソッドを組み合わせた応用例を紹介します。
mapメソッドとjoinメソッドの関係
mapメソッドは、配列の各要素1つ1つに対してブロック内に記述した加工を施すメソッドです。なおmapメソッドでは、要素を加工した配列を返すので、そのままjoinメソッドを適用することが可能です。
例えば、mapメソッドで配列の文字を大文字し変換し、それをjoinメソッドで1つの文字列にするプログラムを作ると次のように書けます。
arr = [ "ab", "cd", "ef", "gh" ] out = arr.map { |a| a.upcase }.join p out # "ABCDEFGH"が表示される
mapメソッドとjoinメソッドを組み合わせた応用例
先ほど紹介したように配列の要素を加工できるmapメソッドと、配列の要素を連結して1つの文字列を作れるjoinメソッドは相性の良いメソッドの組み合わせです。次に、この2つのメソッド使った応用例を紹介します。
mapメソッドとjoinメソッドを組み合わせた例
list = [ "red", "blue", "green" ] csv = list.map{ |item| "#{item}@mail" }.join(", ") p csv # "red@mail, blue@mail, green@mail"が表示される
この例は、配列listに格納された文字列に対して、まずmapメソッドで”@mail”を追加します。次にjoinメソッドで”, “の連結文字を使って1つの文字列に連結し、変数csvに格納します。このような簡単な記述でメールアドレスを列記したCSVファイルの作成が可能です。
Fileクラスのjoinメソッド
これでま配列の要素を連結するjoinメソッドを紹介してきましたが、Fileクラスにもjoinメソッドが定義されています。そしてこのjoinメソッドは、ファイルのパスを作るケースの他、URLを合成するケースでも使えます。次から、Fileクラスのjoinメソッドを紹介します。
Fileクラスのjoinメソッドの文法
配列クラスのjoinメソッドは、配列の変数に続けて「(配列).join」と記述しますが、Fileクラスのjoinメソッドはそうではありません。Fileクラスのjoinメソッドは、引数に接続する文字列を指定すると、「/」で連結した文字列を返します。
Fileクラスのjoinメソッドの文法
File.join( 文字列1, 文字列2, 文字列3, … )
Fileクラスのjoinメソッドの例
base_path = "/var/www/html" config = "config" target = "init.txt" conf = File.join(base_path, config, target) p conf # "/var/www/html/config/init.txt" を表示する
この例では、Fileクラスのjoinメソッドに3つの引数で文字列を指定し、それを「/」で接続したパス名の文字列を返します。
joinメソッドはURLの作成にも使える
先ほどFileクラスのjoinメソッドを使うと、「/」で文字列を連結することでファイルのパス名が作れると解説しました。「/」で接続するのはURLも同じです。そのため、Fileクラスのjoinメソッドは、複数の文字列からURLを作ることにも利用できます。
joinメソッドでURLを合成する例
base_url = "https://style.potepan.com" article = "articles" webpage = "10398.html" url = File.join(base_ule, article, webpage) p url # "https://style.potepan.com/articles"を表示する
この例では、Fileクラスのjoinメソッドに3つの引数で文字列を指定し、それを「/」で接続したURLの文字列を返します。
まとめ
Rubyには配列で使える便利なメソッドがいくつもありますが、今回紹介したjoinメソッドもその一つで、配列の要素を連結して1つの文字列を作れるメソッドです。そのためプログラムの中で特定の配列を入れ替えたり、pushメソッドで追加することで文字列を合成できます。
また、joinメソッドはFileクラスにも定義されており、こちらは引数に複数の文字列を指定すると、その文字からパス名やURLを作れる便利なメソッドです。
どちらもうまく活用すれば複雑な処理をシンプルで記述できるメソッドなので、ぜひ、活用してください。