SlideShare uma empresa Scribd logo
1 de 10
メタプログラミング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, attr)
eval "
class #{klass}
def #{attr}()
@#{attr}
end
def #{attr}=(value)
raise 'Invalid attribute' unless value
@#{attr} = value
end
end
"
end
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
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
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
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
とりあえず言ってみる
普段書くモジュールの形
態にevalから遷移する過
程をテスト付きで時間を
取って書けたこの時間は
非常に有意義であった。
9
おわり
10

Mais conteúdo relacionado

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

Ruby and ActiveSupport for expart
Ruby and ActiveSupport for expartRuby and ActiveSupport for expart
Ruby and ActiveSupport for expart
xibbar
 
Ruby初級者向けレッスン 第46回 ─── Test::Unit
Ruby初級者向けレッスン 第46回 ─── Test::UnitRuby初級者向けレッスン 第46回 ─── Test::Unit
Ruby初級者向けレッスン 第46回 ─── Test::Unit
higaki
 
ClassLoader Leak Patterns
ClassLoader Leak PatternsClassLoader Leak Patterns
ClassLoader Leak Patterns
nekop
 
メタプログラミングRuby勉強会#4
メタプログラミングRuby勉強会#4メタプログラミングRuby勉強会#4
メタプログラミングRuby勉強会#4
Ashitaba YOSHIOKA
 

Semelhante a メタプログラミングRuby勉強会#5 (13)

Ruby and ActiveSupport for expart
Ruby and ActiveSupport for expartRuby and ActiveSupport for expart
Ruby and ActiveSupport for expart
 
Ruby初級者向けレッスン 第46回 ─── Test::Unit
Ruby初級者向けレッスン 第46回 ─── Test::UnitRuby初級者向けレッスン 第46回 ─── Test::Unit
Ruby初級者向けレッスン 第46回 ─── Test::Unit
 
pi-15. カプセル化, MVCモデル, オブジェクトのマッピング
pi-15. カプセル化, MVCモデル, オブジェクトのマッピングpi-15. カプセル化, MVCモデル, オブジェクトのマッピング
pi-15. カプセル化, MVCモデル, オブジェクトのマッピング
 
Phantom Type in Scala
Phantom Type in ScalaPhantom Type in Scala
Phantom Type in Scala
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタート
 
クラスのインスタンス変数について
クラスのインスタンス変数についてクラスのインスタンス変数について
クラスのインスタンス変数について
 
ClassLoader Leak Patterns
ClassLoader Leak PatternsClassLoader Leak Patterns
ClassLoader Leak Patterns
 
Best practice laravel
Best practice laravelBest practice laravel
Best practice laravel
 
演算子オーバーライドをDSLに活用する
演算子オーバーライドをDSLに活用する演算子オーバーライドをDSLに活用する
演算子オーバーライドをDSLに活用する
 
メタプログラミングRuby勉強会#4
メタプログラミングRuby勉強会#4メタプログラミングRuby勉強会#4
メタプログラミングRuby勉強会#4
 
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 1 章
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 1 章【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 1 章
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 1 章
 
Laravel勉強会(データベーステスト編)
Laravel勉強会(データベーステスト編)Laravel勉強会(データベーステスト編)
Laravel勉強会(データベーステスト編)
 
Xtend の紹介
Xtend の紹介Xtend の紹介
Xtend の紹介
 

Mais de Ashitaba YOSHIOKA

Alfrescoのバックアップとレストア
AlfrescoのバックアップとレストアAlfrescoのバックアップとレストア
Alfrescoのバックアップとレストア
Ashitaba YOSHIOKA
 
PolicyとItem (CMIS輪読会#3)
PolicyとItem (CMIS輪読会#3)PolicyとItem (CMIS輪読会#3)
PolicyとItem (CMIS輪読会#3)
Ashitaba YOSHIOKA
 
今さら始めるCoffeeScript
今さら始めるCoffeeScript今さら始めるCoffeeScript
今さら始めるCoffeeScript
Ashitaba YOSHIOKA
 
今さら始めるJavaScript
今さら始めるJavaScript今さら始めるJavaScript
今さら始めるJavaScript
Ashitaba YOSHIOKA
 
Alfresco and Web Script (English)
Alfresco and Web Script (English)Alfresco and Web Script (English)
Alfresco and Web Script (English)
Ashitaba YOSHIOKA
 

Mais de Ashitaba YOSHIOKA (18)

千年繁栄する法
千年繁栄する法千年繁栄する法
千年繁栄する法
 
もくもく会について
もくもく会についてもくもく会について
もくもく会について
 
Alfrescoのバックアップとレストア
AlfrescoのバックアップとレストアAlfrescoのバックアップとレストア
Alfrescoのバックアップとレストア
 
PolicyとItem (CMIS輪読会#3)
PolicyとItem (CMIS輪読会#3)PolicyとItem (CMIS輪読会#3)
PolicyとItem (CMIS輪読会#3)
 
AlfrescoとSolr(後編)
AlfrescoとSolr(後編)AlfrescoとSolr(後編)
AlfrescoとSolr(後編)
 
AlfrescoとSolr(中編)
AlfrescoとSolr(中編)AlfrescoとSolr(中編)
AlfrescoとSolr(中編)
 
Alfresco Google Docs連携
Alfresco Google Docs連携Alfresco Google Docs連携
Alfresco Google Docs連携
 
今さら始めるCoffeeScript
今さら始めるCoffeeScript今さら始めるCoffeeScript
今さら始めるCoffeeScript
 
Alfrescoクラスタリング入門
Alfrescoクラスタリング入門Alfrescoクラスタリング入門
Alfrescoクラスタリング入門
 
今さら始めるJavaScript
今さら始めるJavaScript今さら始めるJavaScript
今さら始めるJavaScript
 
Alfresco CI
Alfresco CIAlfresco CI
Alfresco CI
 
Alfresco JP Site
Alfresco JP SiteAlfresco JP Site
Alfresco JP Site
 
AlfrescoとActiveCMIS
AlfrescoとActiveCMISAlfrescoとActiveCMIS
AlfrescoとActiveCMIS
 
Alfresco Java Foundation API
Alfresco Java Foundation APIAlfresco Java Foundation API
Alfresco Java Foundation API
 
Alfresco and Web Script (English)
Alfresco and Web Script (English)Alfresco and Web Script (English)
Alfresco and Web Script (English)
 
AlfrescoとWeb Script
AlfrescoとWeb ScriptAlfrescoとWeb Script
AlfrescoとWeb Script
 
Alfresco SDKとカスタムアクション
Alfresco SDKとカスタムアクションAlfresco SDKとカスタムアクション
Alfresco SDKとカスタムアクション
 
Alfrescoのインストールと設定
Alfrescoのインストールと設定Alfrescoのインストールと設定
Alfrescoのインストールと設定
 

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