17. Hands on
module HanakoAttribute
def hanako
@hanako
end
!
def hanako=(val)
@hanako = val
end
end
!
class Shibainu
include HanakoAttribute
end
!
ins = Shibainu.new
ins.hanako = "tarou"
puts ins.hanako # => tarou
Answer
18. Hands on
module HanakoAttribute
def hanako
@hanako
end
!
def hanako=(val)
@hanako = val
end
end
!
class Shibainu
include HanakoAttribute
end
!
ins = Shibainu.new
ins.hanako = "tarou"
puts ins.hanako # => tarou
Answer
20. Hands on
module HanakoAttribute
def hanako
@hanako
end
!
def hanako=(val)
@hanako = val
end
end
!
class Shibainu
extend HanakoAttribute
end
!
Shibainu.hanako = "tarou"
puts Shibainu.hanako #=> tarou
Answer
21. Hands on
module HanakoAttribute
def hanako
@hanako
end
!
def hanako=(val)
@hanako = val
end
end
!
class Shibainu
extend HanakoAttribute
end
!
Shibainu.hanako = "tarou"
puts Shibainu.hanako #=> tarou
Answer
23. ★ インスタンスとクラス両方に
同じアクセッサが存在する
★ クラスアクセッサで設定
された値がインスタンスの
アクセッサの初期値となる
★ インスタンスのセッターで
インスタンスの値は変更できる
がクラスの値には影響がない
module HanakoAttribute
# define instance methods
!
def self.included(klass)
klass.extend ClassMethods
end
!
module ClassMethods
# define class methods
end
end
!
class Sample
include HanakoAttribute
end
!
Sample.tarou = "a"
ins = Sample.new
ins.tarou #=> "a"
!
ins.tarou = "b"
ins.tarou #=> "b"
Sample.tarou #=> "a"
Hands on
24. Hands on
module HanakoAttribute
def self.included(klass)
klass.extend ClassMethods
end
!
def tarou
if defined?(@tarou)
@tarou
else
self.class.instance_variable_get(:@tarou)
end
end
!
def tarou=(val)
@tarou = val
end
!
module ClassMethods
def tarou
@tarou
end
!
def tarou=(val)
@tarou = val
end
end
end
!
class Sample
include HanakoAttribute
end
Answer
25. Hands on
module HanakoAttribute
def self.included(klass)
klass.extend ClassMethods
end
!
def tarou
if defined?(@tarou)
@tarou
else
self.class.instance_variable_get(:@tarou)
end
end
!
def tarou=(val)
@tarou = val
end
!
module ClassMethods
def tarou
@tarou
end
!
def tarou=(val)
@tarou = val
end
end
end
!
class Sample
include HanakoAttribute
end
Answer
26. Hands on
module Attribute
def self.included(klass)
klass.extend ClassMethods
end
!
def to_hash
????
end
!
module ClassMethods
def attribute(name)
????
end
end
end
!
class Model
include Attribute
!
attribute :hanako
attribute :tarou
end
!
ins = Model.new
ins.hanako = "shiba"
ins.tarou = "chiwarani"
ins.to_hash
#=> {hanako: "shiba", tarou: "chiwarani"}
★ アクセッサを定義できる
クラスメソッドを定義
してください
★ 設定された値をhashで
返すto_hashメソッドを
定義してください
27. Hands on
module Attribute
def self.included(klass)
klass.extend ClassMethods
end
!
def to_hash
Hash[
self.class.instance_variable_get(
:@attribute_names).map do |n|
!
[n, __send__(n)]
end
]
end
!
module ClassMethods
def attribute(name)
(@attribute_names ||= []) << name
attr_accessor name
end
end
end
!
class Model
include Attribute
!
attribute :hanako
attribute :tarou
end
Answer
28. Hands on
module Attribute
def self.included(klass)
klass.extend ClassMethods
end
!
def to_hash
Hash[
self.class.instance_variable_get(
:@attribute_names).map do |n|
!
[n, __send__(n)]
end
]
end
!
module ClassMethods
def attribute(name)
(@attribute_names ||= []) << name
attr_accessor name
end
end
end
!
class Model
include Attribute
!
attribute :hanako
attribute :tarou
end
Answer
29. Hands on
class Sub < Model
end
!
ins = Sub.new
ins.tarou = "hanako"
ins.to_hash
先ほど作ったModelを
継承してみてください
30. Hands on
class Sub < Model
end
!
ins = Sub.new
ins.tarou = "hanako"
ins.to_hash
# => undefined method `map' for nil:NilClass (NoMethodError)
エラー?!
32. インスタンス変数に継承は関係ない
class Sample
class << self
attr_accessor :hanako
end
end
!
Sample.instance_variables # => []
Sample.hanako = "a"
Sample.instance_variables # => [:@hanako]
!
!
class Sub < Sample
end
!
Sub.instance_variables # => []
Sub.hanako = "a"
Sub.instance_variables # => [:@hanako]
引き継が
れてない
33. Hands on
module Attribute
def self.included(klass)
klass.extend ClassMethods
end
!
def to_hash
Hash[
self.class.instance_variable_get(
:@attribute_names).map do |n|
!
[n, __send__(n)]
end
]
end
!
module ClassMethods
def attribute(name)
(@attribute_names ||= []) << name
attr_accessor name
end
end
end
!
class Model
include Attribute
!
attribute :hanako
attribute :tarou
end
inheritedを使って
Attributeの定義を
引き継ぐように
して下さい
最
終
問
題
34. Hands on
module Attribute
def self.included(klass)
klass.extend ClassMethods
end
!
def to_hash
Hash[
self.class.instance_variable_get(
:@attribute_names).map do |n|
!
[n, __send__(n)]
end
]
end
!
module ClassMethods
def inherited(sub)
sub.instance_variable_set(
:@attribute_names, @attribute_names.dup)
end
!
def attribute(name)
(@attribute_names ||= []) << name
attr_accessor name
end
end
end
Answer
最
終
問
題
35. Hands on
module Attribute
def self.included(klass)
klass.extend ClassMethods
end
!
def to_hash
Hash[
self.class.instance_variable_get(
:@attribute_names).map do |n|
!
[n, __send__(n)]
end
]
end
!
module ClassMethods
def inherited(sub)
sub.instance_variable_set(
:@attribute_names, @attribute_names.dup)
end
!
def attribute(name)
(@attribute_names ||= []) << name
attr_accessor name
end
end
end
Answer
最
終
問
題