Meta programing ruby monday

745 views

Published on

LT_Chukyo 4回目

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
745
On SlideShare
0
From Embeds
0
Number of Embeds
21
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Meta programing ruby monday

  1. 1. メタプログラミング Ruby~月曜日~ The_haigo12年11月13日火曜日
  2. 2. こんにちは12年11月13日火曜日
  3. 3. the_haigoです12年11月13日火曜日
  4. 4. わたくし実は12年11月13日火曜日
  5. 5. リア充な草食系男子12年11月13日火曜日
  6. 6. じゃなかった12年11月13日火曜日
  7. 7. リア住な僧職系男子 なので12年11月13日火曜日
  8. 8. 今回は仏の教え12年11月13日火曜日
  9. 9. ではなく12年11月13日火曜日
  10. 10. Matzの教えを布教するため12年11月13日火曜日
  11. 11. メタプログラミングRubyの LT(LongTalk)を行います12年11月13日火曜日
  12. 12. 今回は 第1章 月曜日:オブジェクトモデル12年11月13日火曜日
  13. 13. 何度も言いますが12年11月13日火曜日
  14. 14. メタプログラミングとは魔法の ようなものであり12年11月13日火曜日
  15. 15. 使い方を誤ると12年11月13日火曜日
  16. 16. 最悪死にます12年11月13日火曜日
  17. 17. では初めていきます12年11月13日火曜日
  18. 18. 本の流れ 主に5つの章に別れており 1章 月曜日∼5章 金曜日でメタプログ ラミングを実例を交えながら説明していく 物語調で書かれており、「レガシーシステ ムをハンマーでぶっ叩いて直すやつら」 という名古屋の怖い人達のような上司ビル と学んでいく感じです12年11月13日火曜日
  19. 19. 1.2オープンクラス 流れ Bookwormのソースコードに目を通し リファクタリングを行う アルファベットとスペースを残して特殊文 字列を削除する機能が付いている12年11月13日火曜日
  20. 20. 1.2 オープンクラス def to_alphanumeric() s.gsub /[^wa]/,”” end require ‘test/unit’ class ToAlphanumericTess < Test::Unit::TestCase def test_strips_non_alpanumeric_characters assert_equal ‘3 the Magic Number’, to_alphanumeric(‘#3, the *Magic, Number*?’) end end12年11月13日火曜日
  21. 21. このメソッドはオブジェクト指向じゃないね 外部のメソッドに文字列を渡すんじゃなく て、文字列自身に変換してもらった方がい いんじゃないかな? ビルさん12年11月13日火曜日
  22. 22. でもこれって、標準のStringクラスじゃ ないですか、メソッド追加するなら、新し くAlphaNumericStringクラス作ったほうが いいっすよ。でも、そこまでする必要はな いかもしれないっすね 別にStingクラス拡張すればいいじゃん12年11月13日火曜日
  23. 23. class String def to_alphanumeric gsub /[^ws]/,’’ end end class StringExtensionsTest < Test::Unit::TestCase def test_strips_non_alphanumeric_characters assert_equal ‘3 the Magic Number’, ‘#3, the *Magic, Number*?’.to_alphanumeric end end12年11月13日火曜日
  24. 24. Bookworm の関数 to_alphanumeric オブジェクトモデルは ではなく 「このメソッドはどのク ラスのものなのか?」 というのがわかるように String class するべき def to_alphanumeric12年11月13日火曜日
  25. 25. 1.2.1 クラス定義の中身 クラスを定義するコードと その他のコードの違いはない 3.times do 実行 class C puts “Hello” Hello end Hello end Hello これは同じクラスを3回定義したわけではない12年11月13日火曜日
  26. 26. class D obj = D.new def x; ‘x’;end obj.x #=> ‘x’ end obj.y #=> ‘y’ class D def y; ’y’; end end class Dを書いた時はまだ、クラスは存在していない。 Rubyがクラス定義の中に入った時に、初めて定義をする 1回目ではxメソッドを定義して2回目の際は既にクラス があるので、class Dを再オープンしてyメソッドを追加す る。12年11月13日火曜日
  27. 27. ・Rubyのclassキーワードは、クラス宣言と言うより も、スコープ演算子のようなものである。 ・もちろん、存在しないクラスは作成するがそれは副 作用でしかない ・classの主な仕事は、あなたをクラスのコンテキスト につれていくことである。12年11月13日火曜日
  28. 28. 既存のクラスを再オープンして、 いつでもそれを修正できる それが オープンクラスだ!(ドヤッ12年11月13日火曜日
  29. 29. 1.2.2オープンクラスの問題点 def replace(array, from ,to) array.each_with_index do |e,i| array[i] = to if e == from end end def test_replace book_topics = [‘html’,‘java’,‘css’] replace(book_topics,‘java’,‘ruby’) expected = [‘html’,‘ruby’,‘css’] assert_equal expected , book_topics end12年11月13日火曜日
  30. 30. class Array def replace(from,to) each_with_index do |e,i| self[i] = to if e == from end end end def test_replace book_topics = [‘html’,‘java’,‘css’] replace(book_topics,‘java’,‘ruby’) expected = [‘html’,‘ruby’,‘css’] assert_equal expected , book_topics end12年11月13日火曜日
  31. 31. バカめ!成功するとでも思ったか!12年11月13日火曜日
  32. 32. 1.2.3 猿マネとモンキーパッチ Array.new().methods.grep = /^re/ #=> [:replace,:reject] つまり Arrayに組み込まれている Replaceメソッドを上書きして しまったので、テストコードが失敗した ということである 名前衝突がないように気をつけよう!12年11月13日火曜日
  33. 33. 1.3クラスの真実 class MyClass def my_method @v = 1 end end obj = MyClass.new obj.class #=> MyClass12年11月13日火曜日
  34. 34. インスタンス変数 obj.instance_variables #=> [] obj.my_method obj.instance_variables #=> [:@v] ・Rubyではオブジェクトのインスタンス変数はクラスとも 何のつながりもない ・インスタンス変数は値を代入した時に初めて出現する ・同じオブジェクトであってもインスタンス変数の数が異 なることがある12年11月13日火曜日
  35. 35. メソッド オブジェクト クラス class obj     MyClass   @var = 1 my_method() インスタンス変数 メソッド ・オブジェクトの内部には、インスタンス変数とクラスへの参照 があるだけ ・クラスにはメソッドがある ・クラスを共有しているオブジェクトはメソッドも共有している12年11月13日火曜日
  36. 36. メソッド ・objがmy_method()メソッドを持っているというが ・MyClassがmy_method()メソッドを持っているとは言わない 後者だとMyClassがクラスメソッドとしてmy_method()があると 勘違いしてしまう my_method()をメソッドではなくMyClassのインスタンスメソッ ドと呼ぶようにすればよい ・オブジェクトに着目している時はメソッド ・クラスに着目している時はインスタンスメソッド12年11月13日火曜日
  37. 37. こんすとらくたー class MyClass def initialize(hoge,huga) @hoge = hoge @huga = huga end attr_accesser :hoge,:huga end obj = MyClass.new(“りゅか”,”にゃん”) obj.instance_variables #=>[:@hoge,:@huga] puts obj.hoge + obj.huga #=> “りゅかにゃん”12年11月13日火曜日
  38. 38. なにやってるか(妄想) class MyClass << Class def MyClass.new() initialize(*arg) end def initialize() #何もしない end end12年11月13日火曜日
  39. 39. オープンクラス!12年11月13日火曜日
  40. 40. class MyClass def initialize(hoge,huga) @hoge = hoge @huga = huga end attr_accesser :hoge,:huga end という風にnew()する時に実行される initialize()を再定義してインスタンス変数を 定義していくんですねー12年11月13日火曜日
  41. 41. 1.3.2 クラス再訪 クラスは オブジェクトである12年11月13日火曜日
  42. 42. ・Classクラス及びすべてのクラスはObjectクラスを 継承している (Classクラスは厳密にはModuleクラスだが) ・Objectに当てはまるものはClassにも当てはまる String.superclass #=> Object Class.class #=> Class Class.superclass #=> Module Class.instance_methods(false) #=> [:superclass,:allocate,:new]12年11月13日火曜日
  43. 43. Object Module class obj1 superclass superclass Class MyClass new() ... obj2 class class ・オブジェクトと同じように、クラスも参照を使って保持する ・obj1とMyClassはどちらも参照であり違うのは  ・obj1は変数  ・MyClassは定数である12年11月13日火曜日
  44. 44. クラスはオブジェクトで、 クラス名は定数なのである12年11月13日火曜日
  45. 45. 1.3.3 定数 ・大文字で始まる参照は、クラス名やモジュール名も含めて全 て定数である ・定数のスコープには、変数のスコープと異なるルールがある module MyModule MyConstant = ‘外部の定数’ class MyClass MyConstant = ‘内部の定数’ end end 定数はファイルシステムみたいに ツリー状である12年11月13日火曜日
  46. 46. 1.3.4 オブジェクトとクラスまとめ    オブジェクトとは何か? インスタンス変数の集まりにクラスへのリ ンクが付いたものである オブジェクトのメソッドは、オブジェクト ではなくオブジェクトのクラスに住んでい て、クラスのインスタンスメソッドとも呼 ばれる12年11月13日火曜日
  47. 47. まとめ2     クラスとは何か?  オブジェクト(Classクラスのインスタンス)に ・インスタンスメソッドの一覧 ・スーパークラスへのリンクがついたものであ る ClassはModuleのサブクラスであり、クラスもモ ジュールである12年11月13日火曜日
  48. 48. まとめ3 通常のオブジェクトと同じようにクラスも new()などのメソッドを持っている これらのメソッドはClassのインスタンスメ ソッドである。 また、クラスにはクラス名という参照を 使ってアクセスしなければならない12年11月13日火曜日
  49. 49. 1.4 クイズ引かれていない線 Objectのクラスは? Moduleのスーパークラスは? Classのクラスは? instance_variable_se(“@x”,10)して新しく作っ たらどんな感じになる?12年11月13日火曜日
  50. 50. 1.4 クイズ引かれていない線 superclass obj1 class Object Module class superclass class superclass obj2 Class MyClass new() ... obj3 class @x=10 class class12年11月13日火曜日
  51. 51. 1.5メソッドを呼び出す時に何が起きてい るの? Rubyはメソッドを呼び出すと以下のことを 行う 1メソッドを探す,これをメソッド探索とい う 2メソッドを実行する,これにはselfと呼ばれ るものが必要だ12年11月13日火曜日
  52. 52. 心折れたので省略 Object 発見 MyClass my_method() class obj.my_method() obj MySubclass12年11月13日火曜日
  53. 53. せるふ JSとかのthisとかそんなもん 省略したり、 明示的にメソッド定義できたりします カレントオブジェクトっていうんだって! クラス定義の中ならクラスがCObj 関数定義ならインスタンス変数がCObj12年11月13日火曜日
  54. 54. class Array def replace(from,to) each_with_index do |e,i| self[i] = to if e == from end end end12年11月13日火曜日
  55. 55. 1.7オブジェクトモデルまとめ オブジェクトは複数のインスタンス変数と クラスへのリンクで構成されている オブジェクトのメソッドはオブジェクトの クラスに住んでいる(クラスから見れば、そ れはインスタンスメソッドと呼ばれる) クラスはClassクラスのオブジェクトであ る。クラス名は単なる定数である12年11月13日火曜日
  56. 56. ClassはModuleのサブクラスである。モ ジュールはメソッドを集めたものである。 クラスはnew()出インスタンス化したり、 superclass()で階層構造を作ったりできる。 定数はファイルシステムのようにツリー上 に配置されている。モジュールやクラスの 名前がディレクトリ、通常の定数がファイ ルのようになっている12年11月13日火曜日
  57. 57. クラスはそれぞれBasicObjectまで続く継承 チェーンを持っている メソッドを呼び出すと、Ruby はレシーバの クラスに向かって一歩右に進み、それから 継承チェーンを上へ向かって進んでいく。 メソッドを発見するか継承チェーンが終わ るまでそれは続く。 クラスがモジュールをインクルードする と、そのクラスの真上の継承チェーンにモ ジュールが挿入される12年11月13日火曜日
  58. 58. メソッドを呼び出す時、レシーバがselfにな る。 モジュール(あるいはクラス)を定義する 時、モジュールがselfになる インスタンス変数は常にselfのインスタンス 変数とみなされる レシーバを明示的に支持せずにメソッドを 呼び出すと、selfのメソッドだとみなされる12年11月13日火曜日

×