みなとRuby会議01での発表「怠惰なRubyistへの道 - Enumerator::Lazy の使いかた」の発表資料を配布用に編集したものです。
ଵଦͳ3VCZJTUͷಓ&OVNFSBUPS-B[Zͷ͍͔ͨ$IJLBOBHB5PNPZVLJ!OBHBDIJLB:PLPIBNBSC1
View Slide
"HFOEB&OVNFSBCMF&OVNFSBUPS&OVNFSBUPS-B[Z2
8"3/*/(ࠓͷ3VCZͷ৽ػೳʹ͍ͭͯ3
3VCZϦϦʔε༧ఆΑΓ"VHCJHGFBUVSFGSFF[F0DUGFBUVSFGSFF[F'FCSFMFBTF3VCZͷੜप4
3VCZະདྷͷ5
JTJOEFWFMPQNFOU˞˞༷։ൃதͷͷͰ͋ΓϦϦʔε൛Ͱมߋ͞ΕΔ߹͕͋Γ·͢6
*OTUBMM3VCZະདྷΛखதʹSWN SCFOWΛ͍ͬͯΕSWNJOTUBMMSVCZIFBESCFOWJOTUBMMEFWFM7
3VCZGPS8JOEPXT8
4FMG*OUSPEVDUJPOUXJUUFSJE!OBHBDIJLBSVCZUSVOLDIBOHFTIUUQEIBUFOBOFKQOBHBDIJLB$3VCZDPNNJUUFS:PLPIBNBSCˠԬԕத4PVOESC SVCZDPSFBVEJP SVCZQVSFEBUB9
&OVNFSBUPS-B[Z10
&OVNFSBUPS-B[Zͷલʹ11
&OVNFSBCMF12
&OVNFSBCMFͪΖΜͬͯ·͢ΑͶ13
"SSBZ )BTI *0"SSBZ)BTI *0&OVNFSBCMFΛJODMVEF͍ͯ͠Δ14
&OVNFSBCMFʲܗ༰ࢺʳ͑ΒΕΔ<ຊޠ8PSE/FU ӳՄࢉʀՄ൪<Ϋϩεϥϯήʔδઐޠࣙॻ>$BQBCMFPGCFJOHFOVNFSBUFEDPVOUBCMF<8JLJUJPOBSZ>15
&OVNFSBCMFʮFBDIϝιουΛݺͿͱɺԿ͔͕ॱʹ /ճZJFMEͰ͞ΕΔʯͱ͍͏ϧʔϧ /16
&OVNFSBCMFFBDIϝιου͕ఆٛ͞Ε͍ͯΔΫϥεʹJODMVEFͯ͠͏ .JYJO17
&OVNFSBCMFFBDI͚ͩ༻ҙ͓͚ͯ͠NBQ TFMFDU SFKFDU HSFQ FUDͱ͍ͬͨϝιου͕͑ΔΑ͏ʹͳΔ͜ΕΒͷϝιου͕FBDIΛ࣮ͬͯ͞Ε͍ͯΔ18
"O&YBNQMFDMBTT"JODMVEF&OVNFSBCMFEFGFBDIZJFMEZJFMEZJFMEFOEFOE"OFXNBQ\]J]J^< >19
͜͜·Ͱͷ·ͱΊ&OVNFSBCMFFBDIϝιουΛͬͯଟ࠼ͳϝιουΛՃ͢Δͳʹ͕ʮ্͑͛ΒΕΔʯͷ͔FBDIϝιου͕ͲͷΑ͏ʹZJFMEΛݺͼग़͔͢Ͱܾ·Δ20
&OVNFSBUPSͬͯ·͢21
&OVNFSBUPSFBDIʹ͢ϒϩοΫΛอཹͨ͠ঢ়ଶͰΦϒδΣΫτͱͯ࣋ͪ͠ճ͢22
UP@FOVN FOVN@GPS&OVNFSBUPSͷ࡞Γ͔ͨw &OVNFSBUPSOFX PCK NFUIPEFBDI BSHTw PCKUP@FOVN NFUIPEFBDI BSHTw PCKFOVN@GPS NFUIPEFBDI BSHTw &OVNFSBUPSOFX\]Z]^ˢ͜Ε͚ͩͪΐͬͱಛघ23
0CKFDUFOVN@GPSFBDIҎ֎ͷҙͷϝιουͷݺͼग़͠Λ&OVNFSBUPSʹͰ͖Δ࣮&OVNFSBCMFͰͳ͍͍ͯ͘F@CZUFTUEJOFOVN@GPS FBDI@CZUFόΠτ͝ͱʹZJFMEF@MJOFTUEJOFOVN@GPS FBDI@MJOFߦ͝ͱʹZJFME24
&OVNFSBUPSOFX\]Z]^F&OVNFSBUPSOFX\]Z]ZZGPPZ^ϒϩοΫ͕FBDIͷΘΓɻϒϩοΫύϥϝʔλZʹ͢ΔͱZJFME͢Δ͜ͱʹͳΔɻ25
&OVNFSBUPSOFX\]Z]^DMBTT"EFGFBDIZJFMEZJFMECBSZJFMEFOEFOE"OFXUP@FOVNͱಉ͡26
&OVNFSBUPSBT&YUFSOBM*UFSBUPS֎෦ΠςϨʔλͱͯ͑͠ΔF UP@FOVNFOFYUFBDI͕ZJFME͢Δ͕FOFYUॱʹOFYUͰऔΓग़ͤΔFOFYUFOFYU4UPQ*UFSBUJPOJUFSBUJPOSFBDIFEBOFOE27
.FUIPE$IBJONBQ TFMFDUͳͲҰ෦ͷϝιουϒϩοΫΛলུ͢Δͱ&OVNFSBUPSΛฦ͢ͷͰෳͷϝιουΛΈ߹Θͤͯ͏BSZNBQXJUI@JOEFY\]W J]^28
.FUIPE$IBJO<B C D E>NBQXJUI@JOEFYEP]TZN J]JFWFO TZNJFOE<B D > &OVNFSBUPSಠࣗͷϝιου29
XJUI@JOEFY.BU[XSPUFlNBQ͕FOVNFSBUPSΛฦ͢ͱPCKNBQXJUI@JOEFY\]Y J]^͕Ͱ͖Δͷ͕خ͍͠ͷͰಋೖͨ͠ͷͰͨ͠ɻͱ͍͏Θ͚ͰɺFBDIʹNBQʹXJUI@JOEFY͕͚ΒΕͯخ͍͠ͱ͍͏ͷ͕ຊͷཧ༝Ͱ͢ɻz30
4FDSFU4UPSZPG&OVNFSBUPS&OVNFSBUPSXJUI@JOEFYͷҝʹੜ·Εͨͱ͍͏ͷӕͰ͕͢ओͳ༻్XJUI@JOEFYͷͨΊͷΑ͏ͳؾ͕͠·͢31
͜͜·Ͱͷ·ͱΊw&OVNFSBUPSw0CKFDUUP@FOVN FOVN@GPSw֎෦ΠςϨʔλԽw.FUIPE$IBJOw32
&OVNFSBUPS-B[Zͷ৽ػೳ33
&OVNFSBUPS-B[Z&OVNFSBUPSͷαϒΫϥε34
&OVNFSBCMFMB[Z&OVNFSBUPS-B[Zͷ࡞Γ͔ͨ&OVNFSBCMFMB[ZΛݺͿ MB[Z&OVNFSBUPS-B[Z35
&OVNFSBUPS-B[Z-B[ZͷNBQ TFMFDU [JQͳͲҰ෦ͷϝιου͕͞Βʹ-B[ZΛฦ͢ MB[ZNBQ\]J]J^&OVNFSBUPS-B[Z&OVNFSBUPS-B[ZNBQ36
&OVNFSBUPS-B[Z> Enumerator::Lazy.instance_methods(false)map collect flat_mapcollect_concat select find_allreject grep ziptake take_while dropdrop_wihle cyclelazy force[ruby 2.0.0dev (2012-05-30 trunk 35844)]37
GPSDF&OVNSBUPS-B[ZGPSDFUP@BͷBMJBTԆ͞Ε͍ͯΔΠςϨʔλͷධՁΛ࣮ߦ38
"-B[Z%FNP>> l = (0..5).lazy=> >> l_map = l.map{|i| p i; i * 2 }=> :map># ͜ͷ࣌Ͱ·ͩϒϩοΫͷ༰࣮ߦ͞Ε͍ͯͳ͍!>> l_map.force012345=> [0, 2, 4, 6, 8, 10]# force ΛݺͿͱ࣮ߦ͞ΕΔ39
&OVNFSBUPSͱͷҧ͍.FUIPE$IBJOͷ͍͔͕ͨΑΓڧྗʹதؒσʔλͷ੍40
1JUGBMMPG&OVNFSBUPS NBQ TFMFDUͷΑ͏ʹϒϩοΫͷΓΛར༻͢ΔϝιουΛෳܨ͛Δ͜ͱ͕Ͱ͖ͳ͍ ͯ͠ҙຯ͕ͳ͘ͳΔNBQTFMFDU\]J]J^< >ˢNBQͷҙຯ͕ͳ͘ͳ͍ͬͯΔ41
5SVF.FUIPE$IBJONBQTFMFDUͱ͍ͬͨϝιου͍ͭ͘Ͱ.FUIPE$IBJOͰ͖Δɻͦ͏ɺ-B[ZͳΒͶɻ͔Βͷ͏ͪҙͷܻʹΛؚΉΛฦ͢MB[ZNBQ UP@TTFMFDU\]T]_T^GPSDF42
1JUGBMMPG&OVNFSBUPS NBQ TFMFDUͷΑ͏ʹϒϩοΫͷΓΛར༻͢ΔϝιουΛ֎෦ΠςϨʔλԽͯ͠ҙຯ͕ͳ͍F TFMFDUFOFYUFOFYUFOFYUFOFYUˢTFMFDUͷҙຯ͕ͳ͘ͳ͍ͬͯΔ43
5SVF&YUFSOBM*UFSBUPSNBQͳͲʹϒϩοΫΛͤΔͷͰద༻ͨ݁͠ՌΛॱʹऔΓग़ͤΔM MB[ZTFMFDU\]J]JFWFO ^MOFYUMOFYUMOFYUMOFYU4UPQ*UFSBUJPOJUFSBUJPOSFBDIFEBOFOE44
&GGJDJFOU.FNPSZ6TBHF-B[ZZJFMEຖʹ.FUIPE$IBJOͷ࠷ޙ·Ͱॲཧ͞ΕΔ45
&OVNFSBCMFWFSTJPOMBSHF@BSSBZNBQ\^TFMFDU\^46
&OVNFSBCMFWFSTJPOMBSHF@BSSBZNBQ\^TFMFDU\^NBQ47
&OVNFSBCMFWFSTJPOMBSHF@BSSBZNBQ\^TFMFDU\^NBQ TFMFDU48
&OVNFSBCMFWFSTJPOMBSHF@BSSBZNBQ\^TFMFDU\^NBQ TFMFDU($͞ΕΔ49
&OVNFSBCMFWFSTJPOMBSHF@BSSBZNBQ\^TFMFDU\^NBQ TFMFDU($͞ΕΔmap ݁ՌͷͨΊlarge_array ͱಉ͘͡Β͍ͷதؒσʔλ͕ඞཁ50
-B[ZWFSTJPOMBSHF@BSSBZMB[ZNBQ\^TFMFDU\^GPSDF51
-B[ZWFSTJPOMBSHF@BSSBZMB[ZNBQ\^TFMFDU\^GPSDF52
-B[ZWFSTJPOMBSHF@BSSBZMB[ZNBQ\^TFMFDU\^GPSDF($`FE53
-B[ZWFSTJPOMBSHF@BSSBZMB[ZNBQ\^TFMFDU\^GPSDF54
-B[ZWFSTJPOMBSHF@BSSBZMB[ZNBQ\^TFMFDU\^GPSDF($`FE55
-B[ZWFSTJPOMBSHF@BSSBZMB[ZNBQ\^TFMFDU\^GPSDF56
-B[ZWFSTJPOMBSHF@BSSBZMB[ZNBQ\^TFMFDU\^GPSDFதؒσʔλ͕ෆཁ57
-B[Z$IBJO%FNP>> (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
-B[ZXJUI*0ྫTUEJO͔ΒۭߦΛಡΉ·Ͱͷ֤ߦͷจࣈͷྻΛฦ͢TUEJOMB[ZUBLF@XIJMF\]M]MDIPNQFNQUZ^NBQ\]M]MDIPNQTJ[F^59
-B[ZXJUI*0&OVNFSBCMFͩͱۭߦ·ͰઌʹಡΜͰ͠·͏ɻ-B[ZͳΒߦಡΉͨͼʹUBLF@XIJMFNBQͷϒϩοΫ͕࣮ߦ͞ΕΔˠஞ࣍ॲཧͰ͖Δ60
-B[Z-JTUແݶʹଓ͘ཁૉΛѻ͑ΔMJTU 'MPBU*/'*/*5:MJTUNBQ\]J]J^UBLF ฦͬͯ͜ͳ͍MJTUMB[ZNBQ\]J]J^UBLF GPSDF< >61
1JUGBMMPG-B[ZϝϞԽ͞Εͳ͍GPSDFΛճݺͿͱ͏ҰFBDI͕ݺΕΔ*0ͳͲ෭࡞༻ͷ͋ΔFBDIͩͱ݁Ռ͕มԽ͢Δ͚Ͳ͍͍ͷ͔ͳ͊ ͍͍͔FOVN@GPSͷΑ͏ʹFBDIͷ͔ΘΓʹͳΔϝιουΛࢦఆͰ͖ͳ͍62
-B[ZBTB#FUUFS&OVNFSBUPS-B[Z&OVNFSBUPSͷਖ਼౷ਐԽ൛63
)BQQZ-B[Z1SPHSBNNJOH64
0OF.PSF5IJOHIUUQTHJUIVCDPNOBHBDIJLBMB[Z@TBNQMF65