際際滷

際際滷Share a Scribd company logo
Vol.2
   Ruby &
ActiveSupport
  for expart
  儲埓岻xibbar
このセッションって


xibbarこと儲が徭蛍の茶がてら櫃鼎
たことをk燕するマニアックなセッションで
す
rubyをしくというよりは、Railsのソ`ス
をiんでびっくりしたことから塗伏して、
rubyとrailsの碧Mみを{べたY惚です
書晩の坪否



1.mix-inをもっと侮く
2.de?ne_xxxを鹿めてみたよ
3.xxx_evalを鹿めてみたよ
class methodを協x

# class methodを弖紗したい

class SampleClass                      盾hポイント
  def self.puts_str(str="hello")
    puts str                       ?クラスメソッドとはクラスで慌
  end
end                                嗤のメソッド。

SampleClass.puts_str
馨庄恰-庄稼でがんばる

                                    ~% 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                              盾hポイント
  end
end                                ?ぎゃ
class SampleClass
  include SampleModule             ?これでできないのか`。。。
end
                                   ?できそうなんだけどなぁ。。
SampleClass.puts_str
                                   ?Yとしては、moduleメソッ
                                   ドはSampleModule.puts_strみ
                                   たいにしか聞えない。
mix-inをもうちょっと

# なんとかmix-inでクラスメソッド
を弖紗したい                              盾hポイント

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つは肝で盾h
  include SampleModule
end

SampleClass.puts_str
includedとextend
included(class_or_module)           extend(module)
   self が include されたときに鵑離ラスまた    哈方で峺協したモジュ`ルのインスタンスメソッドを self の蒙
はモジュ`ルを哈方にインタプリタから柵び竃されま            メソッドとして弖紗します。self を卦します。
す。
                                    include は、クラス(のインスタンス)にC嬬を弖紗しますが、
   module Foo                       extend は、ある蒙協のオブジェクトだけにモジュ`ルのC嬬を
     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"

                    盾hポイント
     ?なんと、includedの哈方は柵び竃し圷そ
      のもの
     ?extendは哈方のモジュ`ルを蒙メソッ
      ドとして弖紗
mix-inでできた

# なんとかmix-inでクラスメソッド
を弖紗したい                                盾hポイント
module SampleModule             ?includedされたタイミングで柵
  def self.included(base)
    base.extend(ClassMethods)   び竃し圷にClassMedhodsを蒙
  end
  module ClassMethods           メソッドとして弖紗
    def puts_str(str="hello")
      puts str
                                ?參貧のY惚により、蒙メソッ
    end                         ドがクラスメソッドのように尅
  end
end                             る玲う
class SampleClass
  include SampleModule
end

SampleClass.puts_str
Sな圭隈 orz
 module ClassMethods                      盾hポイント
   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
庄稼界鉛顎糸艶するとどうなる
                                            盾hポイント

 module ClassMethods                ?蒙メソッドにする弖紗はできるけ
   def puts_str(str="hello")        ど、畠悶にする弖紗はできない。
     puts str
   end                              ?privateなんだとさ。
 end
 class SampleClass                  ?Yとして、extendで蒙メソッドの
 end
                                    弖紗はできるが、includeでクラスメ
 SampleClass.include ClassMethods   ソッドの弖紗をするrは垢健が駅勣に
 SampleClass.puts_str
                                    なる。
                                    ?こんなところにYくなってか。
~% 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だ┐蹐Γ
de?ne_xxxを鹿めてみた

 de?ne_methodModuleクラス



これ參翌にde?ne_xxxはなかったorz
櫃鯣,袂韻靴栃垢辰討澆
                                             盾hポイント
 class SampleClass                  ?まあo尖して聞わなくてもいいな
   define_method(:puts_str){|str|
     puts str                       ?ただ、啜弔縫瓮愁奪匹魘xできる
   }
 end                                 ?それがカッコいい
 sample=SampleClass.new              ?inplace editorの鞭ける何蛍の協x
 sample.puts_str("hello")




~% ruby ruby-expert2-6.rb
hello
eval儘宮を鹿めてみた


instance_evalObjectクラス
class_evalModuleクラス
module_evalModuleクラス
eval┰Mみzみv方
おしまい

おしまい
肝指參週嚠協
ブロック、クロ`ジャ、イテレ`タ
lambda、proc、ついでにbinding
@A
method_missing
erbなんてどう

More Related Content

RubyとActive Support for expert 2