Preface (はじめに)
オブジェクト指向の基本的な考え方として,
- 隠蔽 (capsulation)
- 継承 (inheritance)
- 多形 (polymorphism)
があります.
Rubyに限らず, Pythonや様々な言語でこの考え方が組み込まれています.
Class
前に作成したコマンドの引数に名前を入れると挨拶を返す
hello_method.rb
def hello name
puts "Hello #{name}."
end
name = ARGV[0]
hello(name)
これを改良して, さらにclass化します.
名前を取得
hello_method.rbでは, コマンドの引数を返すようにしましたが, これでは, 何も渡さなかった場合,
> ruby hello_method.rb
-> Hello .
とただの挨拶だけが返ってきます.
このままでは物寂しいため, gets_nameメソッドを用意してコマンドの引数に何も渡さなかった時に
Hello world.
と返ってくるようにします.
greeter.rb
def hello name
puts "Hello #{name}."
end
def gets_name
name = ARGV[0] || 'world'
return name
end
name = gets_name
hello name
class化
このコードをclass化します.
class_greeter.rb
class Greeter
def initialize
@name = gets_name
puts_hello
end
def puts_hello #salute
puts "Hello #{@name}."
end
def gets_name
name = ARGV[0] || 'world'
return name.capitalize
end
end
Greeter.new
これを実行すると
> ruby class_greeter.rb
-> Hello World.
> ruby class_greeter.rb W
-> Hello W.
class化する前と同じ出力を返すものができます.
ここで,
- class Greeter: Greeterクラスの定義
- def initialize: 初期化を施す関数. C++などのコンストラクタと同じような働きかな?
- @name: メンバ変数
- Greeter.new: Greeterクラスのインスタンスを生成
はRubyでのclass化での基本となります.