Rubyについて
学習したことを自分用のアウトプットとして書いていきます。
私なりの解釈ところどころに挟みますので、誤りもあるかと思いますが、おかしな部分あればご指摘ください。
オブジェクト指向言語である
Rubyにおいては全てのオブジェクトは特定のクラスのインスタンスであり、ほぼ全てのクラスはObjectクラスの子孫クラスである。
「ほぼ」全てというのは、BasicObjectという真に全てのクラスの親クラスがあるため。
Rubyの中では全てのデータがオブジェクトであり、数値も文字列も、正規表現・入出力、データベースへの接続、そしてクラスそのものもオブジェクトである。
メソッドやコードブロックをオブジェクトとして扱うこともできる。
RubyにはC++やJavaのような「オブジェクトではないもの」は存在しない。
数値も文字列も全てのデータはオブジェクトである。
Objectとは
- アイデンティティを持っている
- メッセージを受け取る
- 内部状態を持つ
アイデンティティを持っている
オブジェクトとは自分とそうでないものの区別ができるもの。
Rubyではobject_idメソッドによって、オブジェクトの一意な番号を得ることができる。
str1 = "なにか"
str2 = "なにか"
str1.object_id #=> 12345
str2.object_id #=> 78912 (異なる文字列オブジェクト)
メッセージを受け取る
オブジェクトにはメッセージを送ることができる。
オブジェクトはそれを受け取ると対応するメソッド(手続き)を実行し、何らかの処理を行う。
この処理を「メソッド呼び出し」と呼ぶことができる。
内部状態を持つ
オブジェクトは内部状態を持つ。(0個以上)
内部状態はメソッドの実行によって変化することもある。
例えば文字列に文字を追加すると長さが変更になることなどがこれにあたる。
str = "aaa"
str.length #=> 3
str << "bbbb"
str.length #=> 7
要するに簡単にまとめると、オブジェクトとは「何か」であり、「動作」が可能で「状態」を持つことができるものであるという理解をしている。
ちなみにRubyの文字列オブジェクトは変更可能だが、他言語には一度作った文字列オブジェクトは変更できないものもあるらしい。
高階関数を扱いやすい形にまとめた言語である
高階関数とは、関数を引数に取る関数のこと。プログラムのモジュール化を促進できる。
例えば
3.times do
puts "Hello World"
end
見覚えのあるこの形を理解してみる。
3.timesというのは、整数オブジェクトに対するメソッドの呼び出しである。
メソッドの呼び出しにdo ... endのコードブロック(コードのまとまり)を引き渡している。
つまり、メソッドに引数を渡すような作りになっている。
コードブロックを受け取るメソッドをRubyでは「ブロック付きメソッド」と呼ぶ。
また、上記の例のような、受け取ったブロックを繰り返し実行するためのブロック付きメソッドを「イテレータ」と呼ぶ。
言語内DSLである
DSL(Domain Specific Language)
ビルドや使用記述といった特定の分野の為に特化した言語のこと。汎用のプログラミング言語に対して、DSLと言う。
例えばMakefileはシェルスクリプトを含む独自の技術によって構成されるDSLである。
Rubyにおいては、ブロック付きメソッドなどを活用してRubyであると同時にDSLでもあるような言語を定義できる。
つまり自分で作ったブロック付きメソッドによって、Webプログラミングの領域でソフトウェアを書き上げることができるのがRubyの特徴である。
メタプログラミング
Rubyは動的な言語(準備時ではなく実行時に行う言語)である。
自身で作成したメソッドによって制御する事ができる為、似たようなコードならば1箇所にまとめて、違う部分だけをパラメータにして繰り返し実行すればよい。
例えば以下である。
class Duration
%w[ days hours minutes seconds ].each do |name|
attr_accessor name
end
end
d = Duration.new # Durationオブジェクトを作成
d.days = 3 # 属性daysを設定
d.hours = 5 # 属性hoursを設定
p d.days #=>3 属性daysを出力
4つの属性名を保持する配列に対してイテレータを呼び出し、そのブロックの中で属性を定義している。
今日はここまで。別記事に続きます。
参考文献
Yugui, 初めてのRuby, 株式会社オライリー・ジャパン, 2008年