3. classの初歩と継承
# ただの名前と点数を表示するだけ s=Student.new("fujioka")
のプログラム s.english=80
s.puts_status
class Student rs=RikeiStudent.new("katahira")
attr_accessor :name rs.english=80
attr_accessor :english rs.math=92
def initialize(name) rs.science=85
@name=name rs.puts_status
end
def puts_status
puts @name
puts @english ~% ruby person.rb
end fujioka
end 80
katahira
class RikeiStudent < Student 80
92 解説ポイント
attr_accessor :math
attr_accessor :science 85
?継承
def puts_status
super ?attr_accessor
puts @math ?super
puts @science
end
?new
end ?initialize
?ぐらい?
4. classの解説ちょっとだけ
class Student s=Student.new("fujioka")
@@namelist=[] s.english=80
attr_accessor :name s.puts_status
attr_accessor :english rs=RikeiStudent.new("katahira")
def initialize(name) rs.english=80
@name=name rs.math=92
解説ポイント
@@namelist.push name rs.science=85
end rs.puts_status ?クラスメソッド
def puts_status p Student.namelist
puts @name p RikeiStudent.namelist ?インスタンスメソッド
puts @english
end ?クラス変数
def self.namelist ?インスタンス変数
@@namelist % ruby person.rb
end fujioka ?オブジェクトに型がある
end 80
katahira ?変数に型はない
class RikeiStudent < Student 80
attr_accessor :math 92
attr_accessor :science 85
def puts_status ["fujioka", "katahira"]
super ["fujioka", "katahira"]
puts @math
puts @science
end
end
5. classの入れ子
class Sample
attr_accessor :value #<Sample:0x239ec>
KATAHIRA="DO" #<Sample::Sample2:0x23834>
class Sample2 "VALUE"
attr_accessor :value nil
def self.katahira "DO"
KATAHIRA
end
end
class Sample3
end
end
sample=Sample.new
p sample
sample2=Sample::Sample2.new
p sample2
sample.value="VALUE" 解説ポイント
p sample.value
p sample2.value ?インスタンスものは独立している
p Sample::Sample2.katahira
?クラスものは子クラスから呼び出せる
7. moduleをちょっとだけ
module SampleModule
PI=3.14
def self.pi % ruby module.rb
PI 3.14
end 3.14
def pi
PI
end
end
p SampleModule.pi
class SampleClass
include SampleModule
end 解説ポイント
sc=SampleClass.new ?moduleをクラスメソッドのように使う
p sc.pi
?self.piのようにすると呼び出せる
?moduleをmix-in用に使う
?includeするとclassのメソッドの一部になる
8. moduleを入れ子に
module SampleModule
module ChildModule
def child_module % ruby module_chile.rb
"CHILD_MODULE" "SAMPLE_MODULE"
end "CHILD_MODULE"
end
def sample_module
"SAMPLE_MODULE"
end
end
class SampleClass
include SampleModule
include ChildModule
end 解説ポイント
sc=SampleClass.new ?同じネームスペースのものしかmix-inされない
p sc.sample_module
p sc.child_module ?入れ子もincludeしなければならない
?Railsのソースはほとんどmoduleばっかり
?ちょっとだけ見てみよう
?ARの呼び出しの部分でも見てみるか。