Document Links
Class化
復習
前回の記事でClass化について少し触れたが,わかりやすいように復習がてら記述
オブジェクト指向において,鍵となる考え方が,
- 隠蔽(capsulation)
- 継承(inheritance)
- 多態(polymorphism)
の3つです.
Methodはある種の隠蔽だけど,更に言語システムとして徹底したのが, 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
実行結果
$ ruby hello.rb
Hello World.
$ ruby hello.rb Name
Hello Name.
mainでloopがある.
こいつを消したいので,修正すると(前回から少し修正しています)
greeter_class.rb
class Greeter
def initialize
@name = gets_name
puts_hello
end
def puts_hello
puts "Hello #{@name}."
end
def gets_name
name = ARGV[0] || 'world'
return name.capitalize #".capitalize"で先頭が大文字になる
end
end
Greeter.new
実行結果は同じになる.
- Greeter.new
- class Greeter
- initialize method
- @name
なんかが鍵となる.
というところまでしました.
MethodとClassについて
methodとclassを比べるとobject指向の書き方の流儀の違いが実感できるらしい.
- methodでは,verb(subject,object)
- object指向では,subject.verb(object)
とな.
よくわからんが,とりあえず書いてみる.(ついでに出力の色分けもした)
hg_class.rb
require 'colorize'
# method
def hello(name)
"Hello #{name}."
end
# class
class Greeter
def initialize
@name = gets_name
puts_hello
end
def puts_hello
puts "Hello #{@name}."
end
def gets_name
name = ARGV[0] || 'world'
return name.capitalize
end
end
# method call
name = ARGV[0]
puts hello(name).green
# class call
Greeter.new
うーん,まだよくわからん.
資料を読んで,更に加筆,修正していく.
hg_class2.rb
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.red
# extend class call, override
puts ARGV[0].hello.blue
上から,method,継承class,classのoverrideで書いている.
Greeter classはString classから継承することで,hello methodを扱うことが出来ている.(という認識,合ってるのか?)
まだまだ勉強が必要ですな...
attr_accessor
rubyのclassのidiomでよくあるのが,
hg_class2.rb
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.red
# extend class call, override
puts ARGV[0].hello.blue
のようなものらしい.
実行結果
$ ruby hg_class_accessor.rb masa
Hello World.
Hello Masa.
どのように動作しているか,詳しくは講義資料に書いてくれています.
締め
今回はClassについて学んだ.
- source ~/school/multi/my_ruby/grad_members_20f/members/evendemiaire/post/class.org