webエンジニアの日常

RubyやPython, JSなど、IT関連の記事を書いています

Rubyをもう一歩進んで勉強する9章(セッターメソッドについて)

Rubyではメソッド名の末尾に"!"や"?", "="のような非英数字文字を使うことができます。

"!"はメソッドの使用者に注意を促すとき、"?"はメソッドが真偽値を返すのを明示的に表したいときに使ったりします。

たまに、"!"を付けると破壊的メソッドになるとか、真偽値を返すメソッドには必ず"?"を付けなければいけないとか質問されているのを目にしますが、強制力もなければ、メソッド名でメソッドの中身が変わることもありません。

しかし、"="が付いたメソッドは少し特別な意味を持ちます。

続きを読む

Rubyをもう一歩進んで勉強する8章(initializeメソッドについて)

伝統的かどうかわからないが、RubyはJavaなどにあるようなコンストラクタを持っておらず、代わりにnewメソッドから呼ばれるinitializeという特別なメソッドを定義することによりオブジェクトを初期化することができます。

特に定義しなければ、BasicObjectクラスに定義されているinitializeメソッドが呼ばれますが、中身は空なので何も起こりません。

initializeメソッドもほかのメソッドと同じくようにメソッド探索を行い、最初に見つかったinitializeメソッドを実行します。

続きを読む

Rubyをもう一歩進んで勉強する7章(superの挙動)

親クラスの同名メソッドを呼ぶsuperについてです。

例えば以下のような場合

class User
  def login(acount, password)
    ~ログイン処理~
  end
end

class AdminUser < User
  def login(password)
    ~ログイン処理~
    ~固有の処理~
  end
end

AdminUserクラスではログインメソッドの中で、親クラスであるUserとログイン処理を共有しています。

同じ処理をなんども書きたくないので、親クラスのログインメソッドを呼びたい。そんなときに使うのがsuperです。

続きを読む

Rubyをもう一歩進んで勉強する6章(メソッド探索と特異クラス)

Rubyでは、継承しているクラスを上へ上へと昇りながらメソッド探索を行います。

一つ上のクラスはsuperclassメソッドで知ることができますが、モジュールをインクルードしたときはsuperclassで検出できず、しかしいつの間にかモジュールのメソッドが使えるようになっています。

今回はその仕組みを紐解いていきます。

そのためにまずは、オブジェクト、クラス、モジュールについて用語を復習しておきます。

続きを読む

Rubyをもう一歩進んで勉強する5章(Rubyが出す警告について)

Rubyはコンパイルすることなく、即座に実行できる言語ですが、実際は構文解析などコンパイラ的な処理を行ってから実行されます。

コンパイラフェーズで出される警告は特に重要で、その大多数が曖昧な書き方ゆえ、さまざまな解釈の中から一つを選択したときに出されます。

例えば、次のような例はコンパイル時に警告が出ます

"808".split /0/

後ろの/0/は正規表現をsplitメソッドの引数に渡したつもりですが、/が割り算演算子に見えなくもありません。

続きを読む

Rubyをもう一歩進んで勉強する4章(Rubyの定数について)

Rubyでは定数を先頭を大文字の変数として定義することができますが、ミュータブル(変更不可)ではありません。

システム全体で定数は変更されないことが期待されますが、イミュータブル(変更可能)となっているので、予期せぬ不具合や見つけにくいバグが生じる恐れがあります。

そこで、4章では定数をミュータブルにする方法を見ていきます。

続きを読む

Rubyをもう一歩進んで勉強する3章(Perl風機能の排除)

第3章はRubyに残っているPerl風機能を排除(できるだけ使わないようにしよう)です。

Rubyは様々な言語から影響を受けながら作られた言語です。

影響を受けた言語の一つとしてPerlがあります。

僕はPerlを触ったことがなく、初めてRubyを触ったのも2系になってからなので(Perl風機能がだんだんと減っている?)実はこの章はあまりピンときませんでした。

Rubyの暗号名多Perl風機能を避けよう

Perl風機能とは何か次の例で示します

続きを読む