目標
Rubyでのclass化(隠蔽,継承)を理解する.
解説
隠蔽
まずは,gets_nameで入力をとってきて,puts_nameでHello ~~と表示するプログラムを使っていきます.
def puts_hello name
puts "Hello #{name}."
end
def gets_name
name = ARGV[0] || 'world'
return name
end
name = gets_name
puts_hello name
入力がない場合はHello worldと表示します.クラス化するメリットとしてはmain loopを隠すことが出来ます.これが隠蔽です.
class Greeter
def initialize
name = gets_name
puts_hello name
end
def puts_hello name
puts "Hello #{name}."
end
def gets_name
name = ARGV[0] || 'world'
return name
end
end
Greeter.new
Greeterというクラスを作ることでmainの部分を隠蔽できました.これを動かすと
>ruby hello_class.rb Taro
Hello Taro.
無事出力されました.
@name
先ほどのnameという変数を@nameとすることでGreeterというクラスの中で参照することが出来ます.それらを反映させると
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
end
end
Greeter.new
先ほどのコードとの違いとして,puts_helloを定義する際に,引数のnameがないという点です.
継承
次はmethodで定義したものをclassに継承していきます.次のコードの中ではinherited classが継承の部分を表しています.
require 'colorize'
#method
def hello name
"Hello #{name}"
end
name =ARGV[0]
puts hello(name).green
#inherited class
class Greeter < String
def hello
"Hello #{self}."
end
end
greeter = Greeter.new(ARGV[0])
puts greeter.hello.red
#extend class
class String
def hello
"Hello #{self}."
end
end
puts ARGV[0].hello.blue
実行してみると以下の結果になります.
Hello Taro
Hello Taro.
Hello Taro.
そして,コードの中のextend classについてはclassに上書き(over ride)したものになっています,
参考にしたサイト
この記事を書くために以下のサイトを参考にしました.チャート式ruby-VI(hello class)
- source ~/grad_members_20f/members/Takahiro-Nishikawa/ruby_hello_class.org