お題:class化
解法:最初のclass
def puts_hello name
puts "Hello #{name}."
end
def gets_name
name = ARGV[0] || 'world'
return name
end
name = gets_name
puts_hello name
これをクラスで書くと
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 hello_class.rb
Hello world
- Greeter.new
- class Greeter
- initialize method
- @name
@nameはインスタンス変数というらしい.
classはmain loopを無くして代わりにclassにし,イニシャライズを定義したもの.
解説(指向):method的かobject思考的か
methodとclassを比べるとオブジェクト指向の書き方の流儀の違いが実感できるらしい.
method名をverbとすると,
- methodでは,verb(subject, object)
- object指向では, subject.verb(object)
とりあえずサンプルコードを見る.
上から,method, 継承を使ったclass, classへの上乗せ(override)
require 'colorize'
# method
def hello(name)
"Hello #{name}."
end
# inherited class
class Greeter < String
def hello
"Hello #{self}."
end
end
# extend class
class String
def hello
"Hello #{self}."
end
end
# method call
name = ARGV[0]
puts hello(name).green
# inherited class call
greeter = Greeter.new(ARGV[0])
puts greeter.hello.green
# extend class call, override
puts ARGV[0].hello.green
StringをGreeterに継承しているため,GreeterはStringのメソッドを扱える.
overrideに関しては,親クラスで定義しているメソッドと同名のメソッドを子クラスで再定義するものと思っていたためここでの使い方はいまいち理解できていない.要勉強.
- source ~/grad_members_20f/members/yoshida/c6_class_hello.org