SlideShare ist ein Scribd-Unternehmen logo
1 von 15
Downloaden Sie, um offline zu lesen
Vol.2
   Ruby &
ActiveSupport
  for expart
  藤岡岳之(xibbar)
このセッションって


xibbarこと藤岡が自分の勉強がてら気づい
たことを発表するマニアックなセッションで
す
rubyを詳しくというよりは、Railsのソース
を読んでびっくりしたことから派生して、
rubyとrailsの仕組みを調べた結果です
今日の内容



1.mix-inをもっと深く
2.define_xxxを集めてみたよ
3.xxx_evalを集めてみたよ
class methodを定義

# class methodを追加したい

class SampleClass                      解説ポイント
  def self.puts_str(str="hello")
    puts str                       •クラスメソッドとはクラスで共
  end
end                                有のメソッド。

SampleClass.puts_str
mix-inでがんばる

                                    ~% ruby ruby-expert2-2.rb
                                    ruby-expert2-2.rb:12: undefined method
# mix-inでクラスメソッドを追加し                `puts_str' for SampleClass:Class
たい                                  (NoMethodError)
module SampleModule
  def self.puts_str(str="hello")
    puts str                              解説ポイント
  end
end                                •ぎゃ!
class SampleClass
  include SampleModule             •これでできないのかー。。。
end
                                   •できそうなんだけどなぁ。。
SampleClass.puts_str
                                   •結論としては、moduleメソッ
                                   ドはSampleModule.puts_strみ
                                   たいにしか使えない。
mix-inをもうちょっと

# なんとかmix-inでクラスメソッド
を追加したい                              解説ポイント

module SampleModule
                                •なんだこれ?
  def self.included(base)       •クラスメソッドを書きたいだけ
    base.extend(ClassMethods)
  end                           なのに、なげーよ。
  module ClassMethods
    def puts_str(str="hello")   •でも、思いついた人はエラい!
      puts str                  •includedってなんだ?
    end
  end                           •extendってなんだ?
end
class SampleClass               •上の2つは次で解説
  include SampleModule
end

SampleClass.puts_str
includedとextend
included(class_or_module)           extend(module)
   self が include されたときに対象のクラスまた    引数で指定したモジュールのインスタンスメソッドを self の特
はモジュールを引数にインタプリタから呼び出されま            異メソッドとして追加します。self を返します。
す。
                                    include は、クラス(のインスタンス)に機能を追加しますが、
   module Foo                       extend は、ある特定のオブジェクトだけにモジュールの機能を
     def self.included(mod)         追加したいときに使用します。
       p "#{mod} include #{self}"
     end                            module Foo
   end                                def a
   class Bar                            'ok'
     include Foo                      end
   end                              end
   # => "Bar include Foo"
                                    obj = Object.new
                                    obj.extend Foo
                                    p obj.a          #=> "ok"

                    解説ポイント
     •なんと、includedの引数は呼び出し元そ
      のもの
     •extendは引数のモジュールを特異メソッ
      ドとして追加
mix-inでできた

# なんとかmix-inでクラスメソッド
を追加したい                                解説ポイント
module SampleModule             •includedされたタイミングで呼
  def self.included(base)
    base.extend(ClassMethods)   び出し元にClassMedhodsを特
  end
  module ClassMethods           異メソッドとして追加
    def puts_str(str="hello")
      puts str
                                •以上の結果により、特異メソッ
    end                         ドがクラスメソッドのように振
  end
end                             る舞う
class SampleClass
  include SampleModule
end

SampleClass.puts_str
楽な方法 orz
 module ClassMethods                      解説ポイント
   def puts_str(str="hello")       •なんだ、クラスメソッドとしてextend
     puts str
   end                             するだけでよかったのか。
 end
 class SampleClass                 •これでincludeをクラスメソッドとして
 end
                                   やってみるとどうなる?
 SampleClass.extend ClassMethods
 SampleClass.puts_str




~% ruby ruby-expert2-4.rb
hello
includeするとどうなる
                                            解説ポイント

 module ClassMethods                •特異メソッドに対する追加はできるけ
   def puts_str(str="hello")        ど、全体に対する追加はできない。
     puts str
   end                              •privateなんだとさ。
 end
 class SampleClass                  •結論として、extendで特異メソッドの
 end
                                    追加はできるが、includeでクラスメ
 SampleClass.include ClassMethods   ソッドの追加をする時は工夫が必要に
 SampleClass.puts_str
                                    なる。
                                    •こんなところに結論書くなってか。
~% ruby ruby-expert2-5.rb
ruby-expert2-5.rb:11: private       •extendもmix-inの一つだよな。。。
method `include' called for         includeしかmix-inと呼ばないなんてこ
SampleClass:Class (NoMethodError)
                                    とはないよな。。。
とりあえずまとめ



extendでclass methodの追加はできる
includeでclass methodの追加はできない
extendで拡張するのもmix-inだ(ろう)
define_xxxを集めてみた

 define_method(Moduleクラス)



これ以外にdefine_xxxはなかったorz
気を取り直して使ってみる
                                             解説ポイント
 class SampleClass                  •まあ無理して使わなくてもいいな
   define_method(:puts_str){|str|
     puts str                       •ただ、動的にメソッドを定義できる
   }
 end                                 •それがカッコいい
 sample=SampleClass.new              •inplace editorの受ける部分の定義
 sample.puts_str("hello")




~% ruby ruby-expert2-6.rb
hello
eval兄弟を集めてみた


instance_eval(Objectクラス)
class_eval(Moduleクラス)
module_eval(Moduleクラス)
eval(組み込み関数)
おしまい

おしまい
次回以降予定
ブロック、クロージャ、イテレータ
lambda、proc、ついでにbinding
継続
method_missing
erbなんてどう?

Weitere ähnliche Inhalte

Andere mochten auch (9)

栃木Ruby会議02 Lt途中まで
栃木Ruby会議02 Lt途中まで栃木Ruby会議02 Lt途中まで
栃木Ruby会議02 Lt途中まで
 
Adv 410 Quiz 2 Take Home
Adv 410 Quiz 2 Take HomeAdv 410 Quiz 2 Take Home
Adv 410 Quiz 2 Take Home
 
札幌Ruby会議03のlt
札幌Ruby会議03のlt札幌Ruby会議03のlt
札幌Ruby会議03のlt
 
地域振興論2009
地域振興論2009地域振興論2009
地域振興論2009
 
エンジニア志望だったのにRuby社長をしてよかったと思う5つのこと
エンジニア志望だったのにRuby社長をしてよかったと思う5つのことエンジニア志望だったのにRuby社長をしてよかったと思う5つのこと
エンジニア志望だったのにRuby社長をしてよかったと思う5つのこと
 
Fukushima.rb#00
Fukushima.rb#00Fukushima.rb#00
Fukushima.rb#00
 
Japan's games industries
Japan's games industriesJapan's games industries
Japan's games industries
 
仙台Ruby会議02 Pdf
仙台Ruby会議02 Pdf仙台Ruby会議02 Pdf
仙台Ruby会議02 Pdf
 
tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法
tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法
tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法
 

Ähnlich wie RubyとActive Support for expert 2

Rubyのコードを読んでみよう(オブジェクト編)
Rubyのコードを読んでみよう(オブジェクト編)Rubyのコードを読んでみよう(オブジェクト編)
Rubyのコードを読んでみよう(オブジェクト編)
baban ba-n
 
Ruby2.0 - refinements - 鳥取Ruby会 第11回
Ruby2.0 - refinements - 鳥取Ruby会 第11回Ruby2.0 - refinements - 鳥取Ruby会 第11回
Ruby2.0 - refinements - 鳥取Ruby会 第11回
Rie HIRONO
 
20110820 metaprogramming
20110820 metaprogramming20110820 metaprogramming
20110820 metaprogramming
Masanori Kado
 

Ähnlich wie RubyとActive Support for expert 2 (11)

Haskell 6-module
Haskell 6-moduleHaskell 6-module
Haskell 6-module
 
Rubyのコードを読んでみよう(オブジェクト編)
Rubyのコードを読んでみよう(オブジェクト編)Rubyのコードを読んでみよう(オブジェクト編)
Rubyのコードを読んでみよう(オブジェクト編)
 
ebisu.rb #19 超実践 super
ebisu.rb #19 超実践 superebisu.rb #19 超実践 super
ebisu.rb #19 超実践 super
 
Ruby2.0 - refinements - 鳥取Ruby会 第11回
Ruby2.0 - refinements - 鳥取Ruby会 第11回Ruby2.0 - refinements - 鳥取Ruby会 第11回
Ruby2.0 - refinements - 鳥取Ruby会 第11回
 
Xtend の紹介
Xtend の紹介Xtend の紹介
Xtend の紹介
 
Vbaでもtdd
VbaでもtddVbaでもtdd
Vbaでもtdd
 
super super & sub sub の話
super super & sub sub の話super super & sub sub の話
super super & sub sub の話
 
20110820 metaprogramming
20110820 metaprogramming20110820 metaprogramming
20110820 metaprogramming
 
第4回Magento Cafe Plus〜Rewriteと独自テーブル
第4回Magento Cafe Plus〜Rewriteと独自テーブル第4回Magento Cafe Plus〜Rewriteと独自テーブル
第4回Magento Cafe Plus〜Rewriteと独自テーブル
 
2019年度 若手技術者向け講座 デザインパターン
2019年度 若手技術者向け講座 デザインパターン2019年度 若手技術者向け講座 デザインパターン
2019年度 若手技術者向け講座 デザインパターン
 
pi-13. 今までの総まとめ
pi-13. 今までの総まとめpi-13. 今までの総まとめ
pi-13. 今までの総まとめ
 

Mehr von xibbar

Mehr von xibbar (6)

1000speakers仙台
1000speakers仙台1000speakers仙台
1000speakers仙台
 
More Better Nested Set
More Better Nested SetMore Better Nested Set
More Better Nested Set
 
Ruby&Active Support for expert 3
Ruby&Active Support for expert 3Ruby&Active Support for expert 3
Ruby&Active Support for expert 3
 
Tohoku Open Source Conference 2008
Tohoku Open Source Conference 2008Tohoku Open Source Conference 2008
Tohoku Open Source Conference 2008
 
acts_asを使ってみよう
acts_asを使ってみようacts_asを使ってみよう
acts_asを使ってみよう
 
Rails2 Pr
Rails2 PrRails2 Pr
Rails2 Pr
 

Kürzlich hochgeladen

Kürzlich hochgeladen (7)

新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 

RubyとActive Support for expert 2