SlideShare a Scribd company logo
メタプログラミングRuby勉強
会#4
(Class Macro & Around Alias)
2013/07/20
@aegif
class_eval, instance_eval
• class_eval
 クラスのコンテキストに変更を加える
 フラットスコープを持つ為、class_eval()ブロック外の変
数にもアクセスできる
• instance_eval
 selfのみに変更を加える
2
クラスインスタンス変数
クラスに@var?
3
@@varじゃだめなの?
• @@varは・・・
 クラス変数だけど、クラスに属していない
 mainコンテキストに属している
 = Objectに属している
 ↓この実行結果は?
4
@@var = 1
class MyClass
@@var = 2
def self.var
@@var
end
end
puts "MyClass.var is #{MyClass.var}”
puts "Main context, @@var is #{@@var}"
実行結果
5
MyClass.var is 2
Main context, @@var is 2
6
対策
7
クラスインスタンス変数
を使う。なぜならクラス
はクラスのオブジェクト
だから。
特異メソッド
8
特定のオブジェクトに特
化したメソッド
特異メソッドのサンプル
• ↓この実行結果は?
9
class Book
def initialize(title, author)
@title = title
@author = author
end
attr_accessor :title, :author
end
a = Book.new('one world', 'jal')
b = Book.new('sky team', 'ana')
def a.mine
"#{title} is mine"
end
puts a.mine
puts b.mine
実行結果
10
one world is mine
eigen_method.rb:17:in `<main>': undefined method `mine' for #<Book:0x007fdeed04b158
@title="sky team", @author="ana"> (NoMethodError)
クラスマクロ
• クラス定義のなかで使える単なるクラスメソッド
• ↓例(obsoleteメソッド: クラスマクロ)
11
class Book
def self.obsolete(old_m, new_m)
define_method(old_m) do |*args, &block|
warn "WARNING: #{old_m}() is obsolete. Use #{new_m}()."
send(new_m, *args, &block)
end
end
obsolete :NOT_PROPER_METHOD, :proper_method
end
アラウンドエイリアス
• 旧メソッドにエイリアスを付ける
• 新しいメソッドを定義する
• 新しいメソッドから古いメソッドを呼び出す
• ↓例
12
class Fixnum
alias :old_plus :+
def +(num)
self.old_plus(num).old_plus(1)
end
end
おわり
13

More Related Content

PDF
Railsチュートリアルの歩き方 (第4版)
PPTX
メタプログラミングRuby勉強会#7(fluentプラグイン)
PPTX
AWSを利用した開発者・データを扱う人向けの資料
PPTX
メタプログラミングRuby勉強会#5
PPTX
千年繁栄する法
PPT
もくもく会について
PPT
Alfrescoのバックアップとレストア
PPT
PolicyとItem (CMIS輪読会#3)
Railsチュートリアルの歩き方 (第4版)
メタプログラミングRuby勉強会#7(fluentプラグイン)
AWSを利用した開発者・データを扱う人向けの資料
メタプログラミングRuby勉強会#5
千年繁栄する法
もくもく会について
Alfrescoのバックアップとレストア
PolicyとItem (CMIS輪読会#3)

More from Ashitaba YOSHIOKA (14)

PDF
AlfrescoとSolr(後編)
KEY
AlfrescoとSolr(中編)
KEY
Alfresco Google Docs連携
KEY
今さら始めるCoffeeScript
KEY
Alfrescoクラスタリング入門
KEY
今さら始めるJavaScript
KEY
Alfresco CI
KEY
Alfresco JP Site
KEY
AlfrescoとActiveCMIS
KEY
Alfresco Java Foundation API
KEY
Alfresco and Web Script (English)
KEY
AlfrescoとWeb Script
KEY
Alfresco SDKとカスタムアクション
KEY
Alfrescoのインストールと設定
AlfrescoとSolr(後編)
AlfrescoとSolr(中編)
Alfresco Google Docs連携
今さら始めるCoffeeScript
Alfrescoクラスタリング入門
今さら始めるJavaScript
Alfresco CI
Alfresco JP Site
AlfrescoとActiveCMIS
Alfresco Java Foundation API
Alfresco and Web Script (English)
AlfrescoとWeb Script
Alfresco SDKとカスタムアクション
Alfrescoのインストールと設定
Ad

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