Ruby

こんにちは、しきゆらです。
今回は、最近意図的に行っている「良いといわれているライブラリのコードを読む」一環として、
Ruby on Railsの便利メソッドの一つ「blank?」の定義を見てみます。

 

なぜこんなことしているの???

私は、これまでライブラリ等を使わずに自分であれこれコードを書いてきました。
しかし、自分の中でいいコーディングの方法が確立できているわけではないので、設計や記述が悪くスクラップ&ビルド状態でうまく作り続けることができませんでした。

そんな中、先輩から「一般的に良いといわれているコードに触れておくと勉強になる」ということを伺い、実践してみようと思い立ったわけです。
読む者は、良く触れるものであれば何かあったときに対応しやすそうだと思ったのでRailsを選びました。
コードが複雑であり、Ruby自体を拡張するというRubyの機能をフル活用しているっぽい印象もあったのも選んだ理由ですね。

 

本題

ここから、実際に定義を見てみます。

今回見ていくメソッドは、ここにあります。

ターゲット:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/object/blank.rb

 

blank?メソッドは、Active Supportの中で定義されていました。
Railsでよく使われる便利メソッドの多くがここで定義されているようです。
Rubyで定義されているメソッドを拡張したり、あると便利な機能をオープンクラスを使って拡張したりと凶悪な側面もあります。

では、実際に中身を見てみます。

 

定義

[ruby]
def blank?
respond_to?(:empty?) ? !!empty? : !self
end
[/ruby]

定義はシンプルですね。
empty?メソッドが定義されていればそれを返し、そうでなければ自分自身の否定を返しています。
つまり、基本的にはempty?と似たような動きをしています。

「自分自身の否定」というのは、例えばRubyの場合は0もtrueとして扱うので「!0」はfalseとして返します。
Rubyのオブジェクトでfalse扱いになるのはfalseとnilだけであり、それ以外のオブジェクトはtrueとして扱われています。

挙動としては、メソッド名の通り「""」のような空文字や空配列など空白であるときにtrueを返します。
便利なところとしては、nilクラスにも定義されているので便利。

[ruby]
class NilClass
  def blank?
    true
  end
end
[/ruby]

NilClassと同様に、TrueClassやFalseClassにも定義されています。
また、ArrayやHashではempty?メソッドのaliasとしてblank?を定義しています。
つまり、どのクラスでも同じメソッドで呼べるようになっています。

注目すべきは、このblank?メソッドはObjectクラスで定義されているということですね。
Rubyで定義されているObjectクラスはすべてのクラスの親クラスなので、どのクラスでも使えるようになります。
便利ですね。

 

オープンクラス

どういうものか、ということは調べるとたくさん資料が出てきますが、簡単に言えば以下の通り。

オープンクラスとは、言語仕様として、クラスや継承やミックスインといった手続きなしに、既存のクラスを自在に拡張するようなコードを書けることを示します。

難しいが強力! Rubyのメタプログラミング、self、特異クラス/メソッド、オープンクラスとモンキーパッチ – @IT

ということで、ArrayやStringなどのRubyが提供しているクラス自体に独自に機能を追加することができるわけです。
頑張れば、メソッド定義などを動的に行うようなこともできてしまいます(いわゆる黒魔術)。
なお、Rubyの+や%など、ほかの言語では演算子と呼ばれるものもメソッドとして定義されているため、安易に上書きするとRuby自体を壊すこともできてしまいます。

Active Supportさんは、この強力であり怖さもあるオープンクラスを利用して、便利機能を追加しているわけです。

 

関連するメソッド

「blank?」に関連して、オブジェクトの存在確認に使われるメソッドとして「present?」があります。
このメソッドの定義も見てみましょう。

定義

[ruby]
def present?
  !blank?
end
[/ruby]

という感じで、blankでなければtrueを返します。
これもObjectクラスで定義されているために、すべてのクラスから利用することができるようになっています。

 

まとめ

さて、今回はRailsさんのコードを読んでみました。
本来であればactive_support.rbから読むべきなんでしょうが、処理が複雑だったり知らない書式が多いと先に進まないので簡単そうな部分から読んでみました。

メソッドの定義自体はシンプルなものであり、どこからでも同じように利用できるように工夫されていました。
こういうものを見ると、便利メソッドでも案外簡単な記述で書かれていることがわかりました。

また、Active Supportのコードを見てみると、実際の記述よりも説明に関するコメントが多いことがわかります。
どのような挙動をするのかを知ることができるので便利です。

今後も、不定期だとは思いますが適宜コードを読んでいこうと思います。
面白そうなものがあれば、またまとめます。

 

今回はここまで。
おわり

Linux,Windows,環境構築

こんにちは、しきゆらです。
Railsと戯れ始めたわけですが、MySQLを動かすために結構時間がかかってしまいました。
serviceで自動起動する方法がわからず、毎回service mysql startとして起動しています。

さて、今回はserviceコマンドを使ってMySQLを立ち上げようとしたときにおこった問題と解決方法をメモしておきます。

 

Ruby,Windows

こんにちは、しきゆらです。
今回は、Railsさんと仲良くなるための施策として、公式のチュートリアルを進めながら理解を深めていこうと思います。

Railsと戯れることが多いのですが、まだまだ仲がいいとは言えません。
デプロイで苦戦した記憶があるのと、Rails流のお作法をきちんと把握しきれていないことが要因です。
そこで、手軽にできて楽しそうなRailsチュートリアルを一通りふれながらRails流のお作法を学んで行きます。

今回は、Rails Guidesにある「Railsをはじめよう」というものをやっていきます。
基本はガイドにある通りですが、一部違うことをすることがあるかもしれません。
この時はきちんと記載します。

 

0. なぜ本ではなく無料のガイドを使うの?

Railsに強い先輩に、良さげな本はないかを聞いたところ、本よりも公式情報のほうがよい、ということを伺いました。
実際、少し見てみるとブログや技術系サイトの情報よりもわかりやすかった気がします。

あとは、大きい要因としては公式情報なので信用できるはずだからです。
発売されている本は、間違っていないか等をきちんと調査しているとは思いますが、動かなかった場合

  • 自分の環境・記述が悪い
  • 本の内容が間違えている
  • Rails、関連するライブラリのバグ

等々様々な要因が考えられるわけです。

たいていの場合、自分の環境や記述が間違えていることが多いですが、本の内容自体が間違えていることも意外と多くあります。
また、本の場合は情報の更新がされないので、本革のミスの場合は正誤表を確認しながら作業を進めないといけません。
これは面倒ですよね。

その点、Rails Guidesは(ほぼ)公式情報である上に、きちんと最新情報も書かれているようです。
安心感が違いますよね。
一応、公式サイトや定義を確認しようということもいわれたので、公式のものを使っていきます。

では、実際にガイドをもとに作業を進めていきます。