RubyとActive Support for expert 2

1,523 views

Published on

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

  • Be the first to like this

No Downloads
Views
Total views
1,523
On SlideShare
0
From Embeds
0
Number of Embeds
16
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

RubyとActive Support for expert 2

  1. 1. Vol.2 Ruby &ActiveSupport for expart 藤岡岳之(xibbar)
  2. 2. このセッションってxibbarこと藤岡が自分の勉強がてら気づいたことを発表するマニアックなセッションですrubyを詳しくというよりは、Railsのソースを読んでびっくりしたことから派生して、rubyとrailsの仕組みを調べた結果です
  3. 3. 今日の内容1.mix-inをもっと深く2.define_xxxを集めてみたよ3.xxx_evalを集めてみたよ
  4. 4. class methodを定義# class methodを追加したいclass SampleClass 解説ポイント def self.puts_str(str="hello") puts str •クラスメソッドとはクラスで共 endend 有のメソッド。SampleClass.puts_str
  5. 5. 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 解説ポイント endend •ぎゃ!class SampleClass include SampleModule •これでできないのかー。。。end •できそうなんだけどなぁ。。SampleClass.puts_str •結論としては、moduleメソッ ドはSampleModule.puts_strみ たいにしか使えない。
  6. 6. 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ってなんだ?endclass SampleClass •上の2つは次で解説 include SampleModuleendSampleClass.puts_str
  7. 7. includedとextendincluded(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は引数のモジュールを特異メソッ ドとして追加
  8. 8. 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 ドがクラスメソッドのように振 endend る舞うclass SampleClass include SampleModuleendSampleClass.puts_str
  9. 9. 楽な方法 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.rbhello
  10. 10. 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.rbruby-expert2-5.rb:11: private •extendもmix-inの一つだよな。。。method `include called for includeしかmix-inと呼ばないなんてこSampleClass:Class (NoMethodError) とはないよな。。。
  11. 11. とりあえずまとめextendでclass methodの追加はできるincludeでclass methodの追加はできないextendで拡張するのもmix-inだ(ろう)
  12. 12. define_xxxを集めてみた define_method(Moduleクラス)これ以外にdefine_xxxはなかったorz
  13. 13. 気を取り直して使ってみる 解説ポイント class SampleClass •まあ無理して使わなくてもいいな define_method(:puts_str){|str| puts str •ただ、動的にメソッドを定義できる } end •それがカッコいい sample=SampleClass.new •inplace editorの受ける部分の定義 sample.puts_str("hello")~% ruby ruby-expert2-6.rbhello
  14. 14. eval兄弟を集めてみたinstance_eval(Objectクラス)class_eval(Moduleクラス)module_eval(Moduleクラス)eval(組み込み関数)
  15. 15. おしまいおしまい次回以降予定ブロック、クロージャ、イテレータlambda、proc、ついでにbinding継続method_missingerbなんてどう?

×