Submit Search
Upload
怠惰なRubyistへの道
•
4 likes
•
1,320 views
nagachika t
Follow
みなとRuby会議01での発表資料の配布版
Read less
Read more
Technology
Report
Share
Report
Share
1 of 65
Download now
Download to read offline
Recommended
怠惰なRubyistへの道 fukuoka rubykaigi01
怠惰なRubyistへの道 fukuoka rubykaigi01
nagachika t
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
Ryo Sakamoto
Boost Tour 1.50.0 All
Boost Tour 1.50.0 All
Akira Takahashi
きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回
Tomoya Kawanishi
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
Takuro Iizuka
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
Norishige Fukushima
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
MITSUNARI Shigeo
llvm入門
llvm入門
MITSUNARI Shigeo
Recommended
怠惰なRubyistへの道 fukuoka rubykaigi01
怠惰なRubyistへの道 fukuoka rubykaigi01
nagachika t
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
Ryo Sakamoto
Boost Tour 1.50.0 All
Boost Tour 1.50.0 All
Akira Takahashi
きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回
Tomoya Kawanishi
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
Takuro Iizuka
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
Norishige Fukushima
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
MITSUNARI Shigeo
llvm入門
llvm入門
MITSUNARI Shigeo
Popcntによるハミング距離計算
Popcntによるハミング距離計算
Norishige Fukushima
Boost.SIMD
Boost.SIMD
Akira Takahashi
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
Takeshi Yamamuro
boost tour 1.48.0 all
boost tour 1.48.0 all
Akira Takahashi
プログラムを高速化する話
プログラムを高速化する話
京大 マイコンクラブ
C++0x in programming competition
C++0x in programming competition
yak1ex
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介
MITSUNARI Shigeo
深層学習 Day1レポート
深層学習 Day1レポート
taishimotoda
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
Kohsuke Yuasa
Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介
MITSUNARI Shigeo
新しい並列for構文のご提案
新しい並列for構文のご提案
yohhoy
constexpr idioms
constexpr idioms
fimbul
R-hpc-1 TokyoR#11
R-hpc-1 TokyoR#11
Shintaro Fukushima
Metaprogramming in JuliaLang
Metaprogramming in JuliaLang
Yuichi Motoyama
Emcjp item33,34
Emcjp item33,34
MITSUNARI Shigeo
深層学習フレームワークChainerの紹介とFPGAへの期待
深層学習フレームワークChainerの紹介とFPGAへの期待
Seiya Tokui
Juliaで並列計算
Juliaで並列計算
Shintaro Fukushima
Ruby Kaja のご提案
Ruby Kaja のご提案
nagachika t
CRuby Committers Who's Who in 2013
CRuby Committers Who's Who in 2013
nagachika t
Ruby on azure で game server service
Ruby on azure で game server service
nagachika t
Magellan on Google Cloud Platform
Magellan on Google Cloud Platform
nagachika t
CRuby_Committers_Whos_Who_in_2014
CRuby_Committers_Whos_Who_in_2014
nagachika t
More Related Content
What's hot
Popcntによるハミング距離計算
Popcntによるハミング距離計算
Norishige Fukushima
Boost.SIMD
Boost.SIMD
Akira Takahashi
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
Takeshi Yamamuro
boost tour 1.48.0 all
boost tour 1.48.0 all
Akira Takahashi
プログラムを高速化する話
プログラムを高速化する話
京大 マイコンクラブ
C++0x in programming competition
C++0x in programming competition
yak1ex
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介
MITSUNARI Shigeo
深層学習 Day1レポート
深層学習 Day1レポート
taishimotoda
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
Kohsuke Yuasa
Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介
MITSUNARI Shigeo
新しい並列for構文のご提案
新しい並列for構文のご提案
yohhoy
constexpr idioms
constexpr idioms
fimbul
R-hpc-1 TokyoR#11
R-hpc-1 TokyoR#11
Shintaro Fukushima
Metaprogramming in JuliaLang
Metaprogramming in JuliaLang
Yuichi Motoyama
Emcjp item33,34
Emcjp item33,34
MITSUNARI Shigeo
深層学習フレームワークChainerの紹介とFPGAへの期待
深層学習フレームワークChainerの紹介とFPGAへの期待
Seiya Tokui
Juliaで並列計算
Juliaで並列計算
Shintaro Fukushima
What's hot
(17)
Popcntによるハミング距離計算
Popcntによるハミング距離計算
Boost.SIMD
Boost.SIMD
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
boost tour 1.48.0 all
boost tour 1.48.0 all
プログラムを高速化する話
プログラムを高速化する話
C++0x in programming competition
C++0x in programming competition
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介
深層学習 Day1レポート
深層学習 Day1レポート
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介
新しい並列for構文のご提案
新しい並列for構文のご提案
constexpr idioms
constexpr idioms
R-hpc-1 TokyoR#11
R-hpc-1 TokyoR#11
Metaprogramming in JuliaLang
Metaprogramming in JuliaLang
Emcjp item33,34
Emcjp item33,34
深層学習フレームワークChainerの紹介とFPGAへの期待
深層学習フレームワークChainerの紹介とFPGAへの期待
Juliaで並列計算
Juliaで並列計算
Viewers also liked
Ruby Kaja のご提案
Ruby Kaja のご提案
nagachika t
CRuby Committers Who's Who in 2013
CRuby Committers Who's Who in 2013
nagachika t
Ruby on azure で game server service
Ruby on azure で game server service
nagachika t
Magellan on Google Cloud Platform
Magellan on Google Cloud Platform
nagachika t
CRuby_Committers_Whos_Who_in_2014
CRuby_Committers_Whos_Who_in_2014
nagachika t
BigQuery case study in Groovenauts & Dive into the DataflowJavaSDK
BigQuery case study in Groovenauts & Dive into the DataflowJavaSDK
nagachika t
Functional Music Composition
Functional Music Composition
nagachika t
Viewers also liked
(7)
Ruby Kaja のご提案
Ruby Kaja のご提案
CRuby Committers Who's Who in 2013
CRuby Committers Who's Who in 2013
Ruby on azure で game server service
Ruby on azure で game server service
Magellan on Google Cloud Platform
Magellan on Google Cloud Platform
CRuby_Committers_Whos_Who_in_2014
CRuby_Committers_Whos_Who_in_2014
BigQuery case study in Groovenauts & Dive into the DataflowJavaSDK
BigQuery case study in Groovenauts & Dive into the DataflowJavaSDK
Functional Music Composition
Functional Music Composition
Similar to 怠惰なRubyistへの道
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
mganeko
Boost tour 1_40_0
Boost tour 1_40_0
Akira Takahashi
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
啓 小笠原
Python で munin plugin を書いてみる
Python で munin plugin を書いてみる
ftnk
多次元配列の効率的利用法の検討
多次元配列の効率的利用法の検討
Yu Sato
lispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learning
Satoshi imai
不安定な環境の中でのバッチ処理~JobQueueシステムQudoを使った事例~
不安定な環境の中でのバッチ処理~JobQueueシステムQudoを使った事例~
Akabane Hiroyuki
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
MITSUNARI Shigeo
Tottoruby 20130119
Tottoruby 20130119
Takashi SAKAGUCHI
Wavelet matrix implementation
Wavelet matrix implementation
MITSUNARI Shigeo
Or seminar2011final
Or seminar2011final
Mikio Kubo
Kink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based language
Taku Miyakawa
フィボナッチ数列の作り方
フィボナッチ数列の作り方
Tomoya Kawanishi
"Puzzle-Based Automatic Testing: Bringing Humans into the Loop by Solving Puz...
"Puzzle-Based Automatic Testing: Bringing Humans into the Loop by Solving Puz...
nkazuki
続・ゲンバのSwift
続・ゲンバのSwift
Yuichi Adachi
Chainerチュートリアル -v1.5向け- ViEW2015
Chainerチュートリアル -v1.5向け- ViEW2015
Ryosuke Okuta
フラグを愛でる
フラグを愛でる
MITSUNARI Shigeo
Rの高速化
Rの高速化
弘毅 露崎
x64 のスカラー,SIMD 演算性能を測ってみた @ C++ MIX #10
x64 のスカラー,SIMD 演算性能を測ってみた @ C++ MIX #10
Muneyoshi Suzuki
Ruby 2.5
Ruby 2.5
Masahiro Tomita
Similar to 怠惰なRubyistへの道
(20)
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Boost tour 1_40_0
Boost tour 1_40_0
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
Python で munin plugin を書いてみる
Python で munin plugin を書いてみる
多次元配列の効率的利用法の検討
多次元配列の効率的利用法の検討
lispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learning
不安定な環境の中でのバッチ処理~JobQueueシステムQudoを使った事例~
不安定な環境の中でのバッチ処理~JobQueueシステムQudoを使った事例~
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
Tottoruby 20130119
Tottoruby 20130119
Wavelet matrix implementation
Wavelet matrix implementation
Or seminar2011final
Or seminar2011final
Kink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based language
フィボナッチ数列の作り方
フィボナッチ数列の作り方
"Puzzle-Based Automatic Testing: Bringing Humans into the Loop by Solving Puz...
"Puzzle-Based Automatic Testing: Bringing Humans into the Loop by Solving Puz...
続・ゲンバのSwift
続・ゲンバのSwift
Chainerチュートリアル -v1.5向け- ViEW2015
Chainerチュートリアル -v1.5向け- ViEW2015
フラグを愛でる
フラグを愛でる
Rの高速化
Rの高速化
x64 のスカラー,SIMD 演算性能を測ってみた @ C++ MIX #10
x64 のスカラー,SIMD 演算性能を測ってみた @ C++ MIX #10
Ruby 2.5
Ruby 2.5
More from nagachika t
Make Ruby Differentiable
Make Ruby Differentiable
nagachika t
All bugfixes are incompatibilities
All bugfixes are incompatibilities
nagachika t
Inspection of CloudML Hyper Parameter Tuning
Inspection of CloudML Hyper Parameter Tuning
nagachika t
Ruby trunk changes 統計版
Ruby trunk changes 統計版
nagachika t
Pd Kai#3 Startup Process
Pd Kai#3 Startup Process
nagachika t
Pd Kai#2 Object Model
Pd Kai#2 Object Model
nagachika t
More from nagachika t
(6)
Make Ruby Differentiable
Make Ruby Differentiable
All bugfixes are incompatibilities
All bugfixes are incompatibilities
Inspection of CloudML Hyper Parameter Tuning
Inspection of CloudML Hyper Parameter Tuning
Ruby trunk changes 統計版
Ruby trunk changes 統計版
Pd Kai#3 Startup Process
Pd Kai#3 Startup Process
Pd Kai#2 Object Model
Pd Kai#2 Object Model
Recently uploaded
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
UEHARA, Tetsutaro
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
Hiroshi Tomioka
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
Yuki Kikuchi
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
Hiroki Ichikura
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
akihisamiyanaga1
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
FumieNakayama
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
博三 太田
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
FumieNakayama
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
sugiuralab
Recently uploaded
(9)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
怠惰なRubyistへの道
1.
怠惰なRubyistへの道 Enumerator::Lazyの使いかた
Chikanaga Tomoyuki (@nagachika) Yokohama.rb 1
2.
Agenda Enumerable Enumerator Enumerator::Lazy
2
3.
WARNING 今日の話は Ruby
2.0 の 新機能について 3
4.
Ruby 2.0 2013年リリース予定 [ruby-dev:44691] より Aug.
24 2012: big-feature freeze Oct. 24 2012: feature freeze Feb. 24 2013: 2.0 release Ruby の生誕 20 周年 4
5.
Ruby 2.0 未来の話
5
6.
2.0 is in
development ※注※ 仕様は開発中のものであり リリース版では変更される場合があります 6
7.
Install Ruby 2.0 未来を手中に rvm,
rbenv を使っていれば rvm install ruby-head rbenv install 2.0-devel 7
8.
Ruby 2.0 for
Windows 8
9.
Self Introduction twitter id:
@nagachika ruby trunk changes (http://d.hatena.ne.jp/nagachika) CRuby committer Yokohama.rb → 福岡遠征中 Sound.rb(ruby-coreaudio, ruby-puredata) 9
10.
Enumerator::Lazy
10
11.
Enumerator::Lazy の前に
11
12.
Enumerable
12
13.
Enumerable もちろん使ってますよね?
13
14.
Array, Hash, IO... Array
や Hash, IO は Enumerable を include している 14
15.
Enumerable 【形容詞】 数えられる
[日本語 WordNet(英和)) 可算;可付番 [クロスランゲージ 37分野専門語辞書] Capable of being enumerated; countable [Wikitionary] 15
16.
Enumerable 「each メソッドを呼ぶと、何かが 順に(N回) yield
で渡される」 というルール(N >= 0) 16
17.
Enumerable each メソッドが定義されて いるクラスに include
して 使う(Mix-in) 17
18.
Enumerable each だけ用意しておけば map, select,
reject, grep, etc... といったメソッドが使えるようになる (これらのメソッドが each を使って 実装されている) 18
19.
An Example class A
include Enumerable def each yield 0 yield 1 yield 2 end end A.new.map{|i| i * 2 } # => [ 0, 2, 4 ] 19
20.
ここまでのまとめ Enumerable は each
メソッドを使って 多彩なメソッドを追加する なにが「数え上げられる」のかは each メソッドがどのように yield を呼び出すかで決まる 20
21.
Enumerator 使ってます?
21
22.
Enumerator each に渡すブロックを保留した 状態でオブジェクトとして持ち回す
22
23.
to_enum, enum_for Enumerator の作りかた •
Enumerator.new(obj, method=:each, *args) • obj.to_enum(method=:each, *args) • obj.enum_for(method=:each, *args) • Enumerator.new{|y| ...} ↑これだけちょっと特殊 23
24.
Object#enum_for each 以外の任意のメソッドの呼び出しを Enumerator にできる (実は
Enumerable でなくてもいい) e_byte = $stdin.enum_for(:each_byte) => バイトごとに yield e_line = $stdin.enum_for(:each_line) => 行ごとに yield 24
25.
Enumerator.new{|y|} e =
Enumerator.new{|y| y << 0 y << :foo y << 2 } ブロックが each の代わり。 ブロックパラメータ y に << すると yield することになる。 25
26.
Enumerator.new{|y|} class A
def each yield 0 yield :bar yield 2 end end A.new.to_enum と同じ 26
27.
Enumerator as External
Iterator 外部イテレータとして使える e = (0..2).to_enum e.next # => 0 each が yield する値が e.next # => 1 順に next で取り出せる e.next # => 2 e.next => StopIteration: iteration reached an end 27
28.
Method Chain map, select
など一部のメソッドはブロッ クを省略すると Enumerator を返すので 複数のメソッドを組み合わせて使う ary.map.with_index { |v,i| ... } 28
29.
Method Chain [:a, :b,
:c, :d].map.with_index do |sym, i| i.even? ? sym : i end => [:a, 1, :c, 3] Enumerator 独自のメソッド 29
30.
with_index [ruby-dev:31953] Matz wrote...
mapがenumeratorを返すと obj.map.with_index{|x,i|....} ができるのが嬉しいので導入したのでした。というわけで、 * eachにもmapにもwith_indexが付けられて嬉しい というのが本当の理由です。 30
31.
Secret Story of
Enumerator. Enumerator は with_index の為に 生まれた! というのは嘘ですが 主な用途は with_index の ためのような気がします 31
32.
ここまでのまとめ • Enumerator • Object#to_enum,
enum_for • 外部イテレータ化 • Method Chain • 32
33.
Enumerator::Lazy 2.0 の新機能
33
34.
Enumerator::Lazy Enumeratorのサブクラス
34
35.
Enumerable#lazy Enumerator::Lazy の作りかた Enumerable#lazy を呼ぶ >>
(0..5).lazy => #<Enumerator::Lazy: 0..5> 35
36.
Enumerator::Lazy Lazyのmap,select,zipなど一部のメソッ ドがさらにLazyを返す >> (0..5).lazy.map{|i| i
* 2} => #<Enumerator::Lazy: #<Enumerator::Lazy: 0..5>:map> 36
37.
Enumerator::Lazy > Enumerator::Lazy.instance_methods(false)
map collect flat_map collect_concat select find_all reject grep zip take take_while drop drop_wihle cycle lazy force [ruby 2.0.0dev (2012-05-30 trunk 35844)] 37
38.
force Enumrator::Lazy#force to_a の alias 遅延されているイテレータの評価を実行
38
39.
A Lazy Demo >>
l = (0..5).lazy => <Enumerator::Lazy: 0..5> >> l_map = l.map{|i| p i; i * 2 } => <Enumerator::Lazy: #<Enumerator::Lazy: 0..5>:map> # この時点ではまだブロックの内容は実行されていない! >> l_map.force 0 1 2 3 4 5 => [0, 2, 4, 6, 8, 10] # force を呼ぶと実行される 39
40.
Enumeratorとの違い Method Chain の使いかたがより強力に 中間データの抑制
40
41.
Pitfall of
Enumerator (1) map, select のようにブロックの戻り値 を利用するメソッドを複数繋げることがで きない(しても意味がなくなる) (0..5).map.select{|i| i % 2 == 0 } => [ 0, 2, 4 ] ↑ map の意味がなくなっている 41
42.
True Method Chain map
や select といったメソッドもいくつでも Method Chain できる。 そう、Lazy ならね。 # 1 から 1000 のうち任意の桁に7を含む数を返す (1..1000).lazy.map(&:to_s).select{|s| /7/ =~ s }.force 42
43.
Pitfall of
Enumerator (2) map, select のようにブロックの戻り値 を利用するメソッドを外部イテレータ化し ても意味がない e = (0..5).select e.next # => 0 e.next # => 1 e.next # => 2 e.next # => 3 ↑ select の意味がなくなっている 43
44.
True External
Iterator map などにブロックを渡せるので 適用した結果を順に取り出せる l = (0..5).lazy.select{|i| i.even? } l.next # => 0 l.next # => 2 l.next # => 4 l.next # => StopIteration: iteration reached an end 44
45.
Efficient Memory
Usage Lazy は yield 毎に Method Chain の 最後まで処理される 45
46.
Enumerable version large_array.map{...}.select{...}
46
47.
Enumerable version large_array.map{...}.select{...}
map 47
48.
Enumerable version large_array.map{...}.select{...}
map select 48
49.
Enumerable version large_array.map{...}.select{...}
GCされる map select 49
50.
Enumerable version large_array.map{...}.select{...}
GCされる map select map 結果のため large_array と同じくらいの 中間データが必要 50
51.
Lazy version large_array.lazy.map{...}.select{...}.force
51
52.
Lazy version large_array.lazy.map{...}.select{...}.force
52
53.
Lazy version large_array.lazy.map{...}.select{...}.force
GC ed 53
54.
Lazy version large_array.lazy.map{...}.select{...}.force
54
55.
Lazy version large_array.lazy.map{...}.select{...}.force
GC ed 55
56.
Lazy version large_array.lazy.map{...}.select{...}.force
56
57.
Lazy version large_array.lazy.map{...}.select{...}.force
中間データが不要 57
58.
Lazy Chain Demo >>
(0..4).lazy.select{|i| p “select:#{i}”; i.event? }.map{|i| p “map:#{i}”; i * 2 }.force “select:0” “map:0” “select:1” “select:2” “map:2” “select:3” “select:4” “map:4” => [0, 4, 8] 58
59.
Lazy with IO 例)
$stdin から空行を読むまでの各行の 文字数の配列を返す $stdin.lazy.take_while{|l| ! l.chomp.empty? }.map {|l| l.chomp.size } 59
60.
Lazy with IO Enumerable
だと空行まで先に読んでしまう。 Lazy なら1行読むたびに take_while/map の ブロックが実行される → 逐次処理できる 60
61.
Lazy List 無限に続く要素を扱える list =
(0..Float::INFINITY) list.map{|i| i * 2}.take(5) => 返ってこない list.lazy.map{|i| i * 2 }.take(5).force => [0, 2, 4, 6, 8] 61
62.
Pitfall of Lazy? メモ化されない (force
を2回呼ぶともう一度 each が 呼ばれる) IOなど副作用のある each だと結果が 変化するけどいいのかなぁ(いいかも) enum_for のように each のかわりにな るメソッドを指定できない 62
63.
Lazy as a
Better Enumerator Lazy は Enumerator の 正統進化版 63
64.
Happy Lazy Programming!
64
65.
One More Thing! https://github.com/nagachika/lazy_sample
65
Download now