-> English version



るびくる&RBのRubyプログラミング大作戦!
Ruby FacetsでおしゃれなRubyistになろう!(パート1:概要編)

このエントリーをはてなブックマークに追加

るびくる:
Rubyの自称マスコットキャラクター。
普段使っているテキストエディタはJmEditor2。理由は見た目がオシャレで、左側にアウトライン(関数一覧)が出るから。

RB(あーるびー):
解説役兼るびくるの指導役。
普段使っているテキストエディタはSublime Text2。理由は見た目がオシャレで、スニペット機能も便利な上に
カーソルを複数に増やす(複数選択する)ことで変態的な編集ができるようになるから。


(ドタドタドタ)

(ガラッ)RB! 最近のRuby界の流行を教えて!

いきなりフワッとした無理難題を突き付けるなあ。
もうすこし順を追って説明してくれる?

んーとね、この前友達と話をしてるときに
友達が「tryメソッド便利」「blank?メソッドがステキ」「stampメソッドはもう手放せない」とか言ってたんだよね。
わたしはそれを聞きながら
「そんな便利メソッドがあるんだ! これは帰ってから調べて女子力アップを図らねば」って思ってたんだけど。

(女子力ってプログラミングの知識をつけてアップするものだっけ?)

でもさ、そのメソッド、帰ってからRubyのリファレンスマニュアルを調べてみても
どこにも載ってないんだけど……
もしかして、わたしが空耳したのかな? もしくは白昼夢を見た?

ああ、それはそもそもRubyに標準で組み込まれてるメソッドじゃないからだね。

え?

るびくるが聞いたtryblank?stampっていうのは
Rubyに標準で組み込まれてるメソッドじゃなくて、Ruby Facetsっていう別のライブラリに含まれてるメソッドなんだよ。
だから確かに、リファレンスマニュアルのどこを見ても載ってないはずなんだ。

Ruby Facets? 何それ、どんなライブラリ? 便利なやつ?
それを知ることで、わたしは今よりもおしゃれなRubyistになれるの?

おしゃれについては保証できないけど……
そうだね、ちょうどいい機会だから、今回はRuby Facetsについて説明していこうか。

やったー! これでわたしの女子力も完璧だね!!

僕も女子力って言葉の意味はよく知らないけど、たぶん今のるびくるは女子力の意味を勘違いしてると思う。

いいんだよ、どうせ女子力なんてちゃんとした意味のない、ふわっとしたハヤリ言葉なんだし。

(今さらっとマスコットらしからぬ毒を吐いた!)


1. Ruby Facetsってどんなライブラリ?

Ruby Facetsは、簡単に言うと
組み込みクラスや標準添付ライブラリにメソッドを追加して、わかりやすいRubyコードを書けるようにするライブラリ」なんだ。
「便利メソッドの詰め合わせ」って言うと、もうちょっとわかりやすいかな。

わかりやすいRubyコードを書けるようにする? どゆこと?

そうだね、例えば……このRubyコードを見てもらえる?

やってることはすごく単純で、出力パス(options[:output_path])の前後の空白を取り除いて
変数に設定するだけの、1行コードだよ。
ただし、options[:output_path] の値はnilの場合もあるから
nilの場合でもエラーで落ちないようにしないといけないってのがミソ。

@stripped_path = (options[:output_path].nil? ? nil : options[:output_path].strip)
@stripped_path = options[:output_path].try.strip

上が普通にRubyで書いてみた場合のコード、下がRuby Facetsを読み込んで書いてみた場合のコードだよ。

あ、tryってメソッドが出てきてる!
これがRuby Facetsの中に入ってる、追加メソッドの1つなんだね。

でも、これってどういう役割のメソッドなの?

えーっと、たとえばるびくるがコードを書いてて、ある変数に対してメソッドを呼ぶときに
その変数の内容がnilであるかもしれない、って場合があるよね?
そうした場合に、わざわざnilであるかどうかを判定しなくても、tryメソッドを間に挟めば
対象(レシーバ)がnilのときはメソッドを呼ばずに、nil以外の値だったときだけメソッドを呼んでくれるんだよ。

つまり……さっきの例で言うと、

  • options[:output_path]がnil以外なら、stripメソッドを実行して前後の空白を取り除いたものを、@stripped_pathに入れる
  • options[:output_path]がnilなら、(stripメソッドを実行せずに)nilを@stripped_pathに入れる

っていうこと?

その通り。
まさしくtryっていう名前通り、「メソッドの実行をできるかどうか試したい」ときに使える、便利なメソッドだね。

なるほど、確かにこれは便利だね!
Ruby Facetsっていうのは、こういうちょっとすてきなメソッドが
たくさん入ってるライブラリなんだね。

そういうこと。
このtryメソッドはっていう、別のライブラリ由来のメソッドなんだけど
Ruby Facetsにはこんな感じの、コードをちょっと美しく、便利にしてくれる拡張が
大量に収録されているんだよ!


2. Ruby Facetsにはどのくらいの数のメソッドがあるの?

ちなみに、「大量に収録されている」ってどのくらい?

うーんと……単純なメソッド定義の数(別名含む)だけで言えば、Facets 2.9.3現在で1500前後くらいはあるね。

そんなに!? わたしじゃなくても、その数はさすがに覚えきれないよ!
普段から、Ruby組み込みのメソッドでさえ覚えきれなくて
リファレンスマニュアルをページが擦り切れる勢いでめくってるくらいなのに……

るびくる、いつもPCでリファレンスマニュアル見てるよね?

さておき、覚えきれなくても大丈夫だよ。
Ruby組み込みのメソッドと同じで、だいたい使用頻度の高いもの(=重要なもの)と、低いものがあるから
自分が特によく使いそうなものだけ、かいつまんで覚えていけばいい

極端な話、さっきのtryメソッドを使うためだけにFacetsを使うっていうのもありだし
それだけでも十分に有用だしね。

うーん……でも「自分が特によく使いそうなものだけ」って言うと、簡単に聞こえるけど
それってまず探し出すだけでも、けっこう大変じゃない?

そう、そこが次回以降の話とも絡むんだ。

るびくるの言うとおり、Facetsはメソッドの数自体が多いし、日本語での解説もほとんどないから
便利なライブラリであるにもかかわらず、どんなメソッドがあるのかあんまり知られていないんだよね
だから次回以降は、Facetsの中でも、使うことが多そうなメソッドや使い勝手が良さそうなメソッドを
少しずつ紹介していこうと思ってるよ。

なるほど! そうすれば、わざわざ自分で英語のドキュメントやソースコードを熟読しなくても
ある程度どんなメソッドがあるのかわかる! ってことなんだね。


それじゃ、今回のパート1は「紹介編」だから、ここでいったん終わり。
次回のパート2から、実際にRuby Facetsの中のメソッドを
どんどん説明していくよ!

パート2:facets/kernel/try編に続きます。


注意事項
  • 本記事の内容は、Facets 2.9.3 時点での動作を元にしています。
  • 本記事内で使用しているアイコン画像は、桜去ほとりさんが制作されたものです。クリエイティブ・コモンズ 表示-非営利 3.0ライセンスのもとで、再配布や変更などを行っていただくことができます。
  • 本記事内の文章やソースコードは、CC0ライセンスのもとで、ご自由に利用していただくことができます。
  • ツンツク・モモコのお買い物大作戦と形式が類似していますが、本記事側が一方的に参考にさせていただいただけであり、とくに関連性はありません。

一言メッセージフォーム

るびくるへの質問や、やってほしい企画のリクエスト、Webサイト管理スタッフへの感想・意見・質問など、なんでもお気軽にどうぞ。