Your SlideShare is downloading. ×
0
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Enumerable な何か、あるいは怠惰なる反復
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Enumerable な何か、あるいは怠惰なる反復

865

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
865
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
1
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • いろんなやり方があるはず。\nここでは一例を。\n
  • ロードされているクラスのリストがほしい。\nクラスは定数でもあるから、そこから探してみる。\n\n
  • クラス名から、クラスの実体を取り出す方法\n
  • インスタンスが、あるクラス/モジュールに属しているかどうかを調べる\n
  • あるクラスの継承ツリーを調べる。\n先頭の要素が、該当クラス自身である点に注目。\n
  • \n
  • ここでターミナルに切り替えてデモ。\n
  • \n
  • \n
  • →ターミナルでデモ \nUser = Struct.new(:id, :name, :email)\nとかで例を見せる\n
  • ターミナルでデモ\nFile, Dir で例を見せる\n
  • Enumerable なクラスの特徴\nコレクションとは限らない\n
  • \n
  • \n
  • \n
  • each にブロックを渡さないところに注目\n(次以降に例が続く。まだターミナルに切り替えない)\n
  • \n
  • \n
  • \n
  • \n
  • 巻戻しもできる\nここでターミナルに切替えてデモ\n
  • \n
  • Enumerator に対して #map を呼出す\nターミナルに切替えてデモ\n
  • \n
  • \n
  • \n
  • Array と Hash じゃ足りないこと、あるよね?\nツリー作るとか。\n
  • 手間がかかりそうな予感。\nでも、やってみたら意外とシンプル。\n
  • Enumerable には #each は存在しない。\n(よく考えてみると当然。内部のデータ構造を知らないと each は書けない)\n
  • \n
  • 場合によっては泥臭い処理を書かなきゃいけないかも。\n
  • \n
  • \n
  • コードを眺めながら解説\nその後、ターミナルに切替えて、実際の動きをデモ。\n
  • \n
  • \n
  • 次の話題へ。\n
  • git 配下にはファイルがいっぱい。\nmap の後ろにはまだまだ処理が続くと思ってください。\n
  • \n
  • \n
  • 名前の通り。\n
  • \n
  • \n
  • \n
  • \n
  • たとえば最初の要素を見ようとすると評価が走る。\n但し、2,3 については map されない。\n→ターミナルでデモ\n
  • \n
  • lazy 対応してやらなきゃダメ?\n
  • 実装側には何も対応いらない。呼出し側で単に #lazy を最初に入れるだけ。\n→ターミナルに移動してデモ\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Transcript

    1. Enumerable な何か、あるいは怠惰なる反復 2012.08.11 るりま読書会 SAWADA Tadashi a.k.a. @cesare
    2. こんにちは
    3. 沢田正@cesare
    4. Startup な会社の 中の人
    5. Tokyu.rb
    6. 発音にうるさい人
    7. ところで
    8. Enumerable
    9. いなめらぶる
    10. いにゅーめらぶる
    11. 閑話休題
    12. 今日のお品書き
    13. •Enumerable なクラス• 自作 Enumerable• Enumerable#lazy
    14. each が dis られた直後に、each重要という話をします
    15. Enumerable な クラス
    16. •Array• Hash• ...
    17. 探してみよう
    18. 下調べ
    19. Class.constants# => [:Object, :Module, :Class, :BasicObject, ...]
    20. Class.const_get(:String)# => String
    21. "string".is_a?(String)# => true
    22. String.ancestors# => [String,テキスト Comparable, Object, Kernel, BasicObject]
    23. •コレクションの変換•コレクションの取捨選択• Enumerable な機能を活用
    24. Class.constants .map {|name| Class.const_get(name) } .select {|obj| obj.is_a?(Class) } .map {|clazz| clazz.ancestors } .select {|classes| classes.member?(Enumerable) } .map(&:first)
    25. [Array, Hash, Struct, Range, IO, File, Dir, Enumerator, StringIO]
    26. Array, Hash, Range
    27. Struct
    28. IO, File, Dir, StringIO
    29. •1行ずつ処理• 1バイトずつ処理• 1エントリーずつ処理
    30. Enumerator も Enumerable
    31. Enumerator ってなに?
    32. 外部イテレーター
    33. e = [1,2,3].each# => #<Enumerator: ...>
    34. # e = [1,2,3].eache.next# => 1
    35. # e = [1,2,3].eache.nexte.next# => 2
    36. # e = [1,2,3].eache.nexte.nexte.next# => 3
    37. # e = [1,2,3].eache.nexte.nexte.nexte.next# => StopIteration: iteration reached an end
    38. # e = [1,2,3].eache.nexte.nexte.nexte.rewinde.next# => 1
    39. Enumerator も Enumerable
    40. e = [1,2,3].each# => #<Enumerator: ...>e.map{|i| i.to_s }# => ["1", "2", "3"]
    41. ここまでのまとめ
    42. Enumerable なクラスとは、•コレクション的なやつ• IO的なやつ•Enumerator
    43. Enumerable ク ラスを作る
    44. 自作のデータ構造をEnumerable 化 したい
    45. やりかた
    46. •each を実装• include Enumerable
    47. ポイント
    48. • コレクションを回す each は自分で頑張る• ブロックを渡されない場合の each は Enumerator を返す• 他のメソッドは Enumerable にお任せ
    49. 実装例
    50. 1 class Directory 2 include Enumerable 3 4 def initialize(dirname) 5 @dirname = dirname 6 @files = Dir.open(dirname) {|dir| 7 dir.reject {|name| name == "." || name == ".." } 8 } 9 end1011 def each(&block)12 if block_given?13 @files.each do |name|14 path = File.join(@dirname, name)15 if File.directory?(path)16 Directory.new(path).each(&block)17 else18 yield path19 end20 end21 else22 Enumerator.new(self, :each)23 end24 gist.github.com/3296137 end25 end
    51. 1 class Directory 2 include Enumerable 3 4 def initialize(dirname) 5 @dirname = dirname 6 @files = Dir.open(dirname) {|dir| 7 dir.reject {|name| name == "." || name == ".." } 8 } 9 end1011 def each(&block)12 if block_given?13 @files.each do |name|14 path = File.join(@dirname, name)15 if File.directory?(path)16 Directory.new(path).each(&block)17 else18 yield path19 end20 end21 else22 Enumerator.new(self, :each)23 end24 end25 end
    52. ここまでのまとめ
    53. Enumerable にするには、•each が Enumerable の要•each 書かないと負け><
    54. 問題点
    55. Directory.new("~/git").map{|f| f }# => しばらく返ってこない・・・
    56. Directory.new("/").map{|f| f }# => メモリ足りなくて死ぬ><
    57. そこでEnumerable#lazy ですよ
    58. 遅延評価版Enumerable
    59. •gem install enumerable-lazy•Ruby 2.0 なら標準装備
    60. [1,2,3].lazy# => #<Enumerator::Lazy: ...>
    61. [1,2,3].lazy.each# => #<Enumerator::Lazy: ...>
    62. [1,2,3].lazy.map{|i| i.to_s }# => #<Enumerator::Lazy: ...>
    63. [1,2,3].lazy.map{|i| i.to_s }.first# => ["1"]
    64. [1,2,3].lazy.map{|i| i.to_s }.to_a# => ["1", "2", "3"]
    65. 自作 Enumerable は?
    66. Directory.new("~/git") .lazy.map{|f| f }# => #<Enumerator::Lazy: ...>
    67. Directory.new("~/git") .lazy .grep(/.rb$/) .take(100)
    68. Directory.new("~/git") .lazy .grep(/.hs$/) .each{|f| zmq.send(f ) }
    69. つかいどころ
    70. •巨大なデータ• 終わらないデータ• ストリーミングとか
    71. まとめ
    72. •Enumerable なのは コレクションとか IO とか•each 超重要><•遅延評価すごいよ遅延評価
    73. questions.take(n).map do |q| q.answerend
    74. ご清聴ありがとう ございました

    ×