メタプログラミングRuby勉強
会#5
(eval -> Class Macro -> Module)
2013/08/25
@aegif
eval
便利なのは分かるけど
当然危ない
Dir.glob(‘*’)
2
セーフレベル
$SAFEの設定で
汚染した文字列評価レベ
ルを切り換える
3
eval
• クラスと属性を指定し、値にチェックを掛ける例
4
class Person; end
add_checked_attribute(Person, :age)
def add_checked_attribute(klass, att...
class_eval
• クラスと属性を指定し、値にチェックを掛ける例
5
class Person; end
add_checked_attribute(Person, :age)
def add_checked_attribute(klas...
class_eval with block
• クラスと属性を指定し、値にチェックを掛ける例
6
class Person; end
add_checked_attribute(Person, :age)
def add_checked_att...
Class Macro
• クラスと属性を指定し、値にチェックを掛ける例
7
class Class
def attr_checked(attr, &validation)
define_method attr do
instance_vari...
Module
• クラスと属性を指定し、値にチェックを掛ける例
8
module CheckedAttributes
def self.included(klass)
klass.extend ClassMethods
end
module C...
とりあえず言ってみる
普段書くモジュールの形
態にevalから遷移する過
程をテスト付きで時間を
取って書けたこの時間は
非常に有意義であった。
9
おわり
10
Upcoming SlideShare
Loading in …5
×

メタプログラミングRuby勉強会#5

564 views
488 views

Published on

メタプログラミングRuby読書(手を動かす)会の第五回

Published in: Technology, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
564
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

メタプログラミングRuby勉強会#5

  1. 1. メタプログラミングRuby勉強 会#5 (eval -> Class Macro -> Module) 2013/08/25 @aegif
  2. 2. eval 便利なのは分かるけど 当然危ない Dir.glob(‘*’) 2
  3. 3. セーフレベル $SAFEの設定で 汚染した文字列評価レベ ルを切り換える 3
  4. 4. eval • クラスと属性を指定し、値にチェックを掛ける例 4 class Person; end add_checked_attribute(Person, :age) def add_checked_attribute(klass, attr) eval " class #{klass} def #{attr}() @#{attr} end def #{attr}=(value) raise 'Invalid attribute' unless value @#{attr} = value end end " end
  5. 5. class_eval • クラスと属性を指定し、値にチェックを掛ける例 5 class Person; end add_checked_attribute(Person, :age) def add_checked_attribute(klass, attr) klass.class_eval do define_method attr do instance_variable_get(:@attr) end define_method "#{attr}=" do |value| raise 'Invalid attribute' unless value instance_variable_set(:@attr, value) end end end
  6. 6. class_eval with block • クラスと属性を指定し、値にチェックを掛ける例 6 class Person; end add_checked_attribute(Person, :age) def add_checked_attribute(klass, attr, &validation) klass.class_eval do define_method attr do instance_variable_get(:@attr) end define_method "#{attr}=" do |value| raise 'invalid attribute' unless validation.call(value) instance_variable_set(:@attr, value) end end end
  7. 7. Class Macro • クラスと属性を指定し、値にチェックを掛ける例 7 class Class def attr_checked(attr, &validation) define_method attr do instance_variable_get(:@attr) end define_method "#{attr}=" do |value| raise 'invalid attribute' unless validation.call(value) instance_variable_set(:@attr, value) end end end class Person attr_checked :age do |v| v >= 20 end end
  8. 8. Module • クラスと属性を指定し、値にチェックを掛ける例 8 module CheckedAttributes def self.included(klass) klass.extend ClassMethods end module ClassMethods def attr_checked(attr, &validation) define_method attr do instance_variable_get(:@attr) end define_method "#{attr}=" do |value| raise 'Invalid attribute' unless value raise 'invalid attribute' unless validation.call(value) instance_variable_set(:@attr, value) end end end end
  9. 9. とりあえず言ってみる 普段書くモジュールの形 態にevalから遷移する過 程をテスト付きで時間を 取って書けたこの時間は 非常に有意義であった。 9
  10. 10. おわり 10

×