この記事について
この記事はRuby Advent Calendar 2024の4日目の記事です。
といっても実は最初は登録していなくて、記事がないことに気づいたので後から埋めるタイプの記事になります。
背景
この記事の背景として、Rubyists Blog Feed Linksというプロジェクトがあります。これは私がruby-jpのCosense内に立ち上げたシンプルなプロジェクトで、Rubyistが書いているブログのフィードをリスト化して最終的にはそれをOPMLにして購読しやすくするというものです。
そのリストに以下のような項目が出てきます。
https://feeds.buzzsprout.com/2399844.rss OH! MY RUBYISTポッドキャストのページ
このリストは基本的にはURL nameというフォーマットに則っているのですが、これはnameに空白が含まれています。これだと単純なsplitを使ったときにnameが正しく抽出できなさそうですね?誰なんでしょうね、この項目を追加したのは(私です)。
主題
上記の項目からURLとnameを得るRubyコードは以下です。
url, *name = line.split(" ")
name = name.join(" ")
ここでline変数にはリストの各行が入ります。そう、たったこれだけでした。
解説
irbコマンドなどで以下のコードを実行してみてください。
a = [1, 2, 3]
何が起こるでしょうか。当然、aは[1, 2, 3]となりますね。
では、以下はどうでしょう。
b, c = [1, 2, 3]
この場合、bは1でcは2になります。Rubyでは多重代入ができるのですが、この書き方だと溢れた値(ここでは3)は消えてしまいます。
では、次はどうでしょう。
d, *e = [1, 2, 3]
ここでは、dは1ですが、eは[2, 3]になります。この書き方では*付きの変数は配列となり余った値全てを受け取ります。左辺の数が右辺の数より多い場合、*付き変数は空配列になります。
元々のコード解説
url, *name = line.split(" ")
name = name.join(" ")
line変数は文字列ですので、splitメソッドは配列を返します。この書き方では、返り値の配列の最初のアイテムがurlになり、残り(個数不定)がnameになります。個数にかかわらずnameは配列になりますので、joinが呼べます。nameは多くの場合は['okuramasafumi']のように1つの文字列だけが入っている配列ですので、joinするとその文字列がそのまま取得できますし、['OH!', 'MY', 'RUBYISTポッドキャストのページ']のようになっていてもjoin(" ")することで復元できます。
まとめ
実はここに書いたことはるりまに書いてあります。詳細はそちらをご覧ください。
この記事の目的としては、多重代入における*付き変数の実際の利用例を示すことでした。実際にやってみるとわかるのですが、端的に書けるのでかなり気分が良いです。皆さんも機会がありましたら使ってみてください。
おまけ
ブログをお持ちのRubyistの方は、 https://scrapbox.io/ruby-jp/Rubyists_Blog_Feed_Links へのフィードの追加をお願いします!