ãã¨ãã°æ´æ°ã®é åãããæ¡ä»¶ã«åãè¦ç´ ã®ãã¡ãæåã«ç¾ãã 10 åã ãæ¾ãããã¨ããã©ããã¾ããï¼
ary.select {|x| x.even? }.take(10)
âããã¯éå¸¸ã«æçãªããã°ã©ã ã§ããããã select ã¯ãæåã® 10 åã ãã§ãªãå ¨è¦ç´ ããã§ãã¯ãã¦ãã¾ããããary ã大ããã¨ç¡é§ã«ã«ã¼ããã¾ããã¾ããselect ã®æ»ãå¤ã¨ãªãä¸éé åãç¡é§ã§ãã
ret = [] ary.each do |x| ret << x if x.even? break if ret.size == 10 end
âãããªã 10 åè¦ã¤ãã£ãæç¹ã§çµäºãã¦ãããããç¡é§ãªé å確ä¿ãããã¾ããããããé常ã«å¼·å¼ã§åå§çã§ç ©éãªããã°ã©ã ã§ãããRuby 1.9 ã®æä»£ãè¿ããæ°äººé¡ã§ããæã ã«ã¯ãå¯èªæ§ãã¡ã³ããã³ã¹æ§ã«åé¡ãããã¨è¨ããããå¾ãªããä¸è¨ã§è¨ãã¨åããªãã®ã§ãã
ãRuby 1.9 ã«ã¯ Enumerator 㨠to_enum ãããããä½ã¨ããªãï¼ã
çºæ³ã¯ããã§ãããæ®å¿µãªãç¥ããã§ãã
(1..50).to_enum(:select) {|x| x.even? }.take(10) #=> [1,2,3,4,5,6,7,8,9,10] # å ¨ç¶ select ã§ãã¦ããªã
ãªãã§ããã§ãã¾ããããªããã¯ã説æãé£ããã®ã§èªåã§èãã¦ãã ãããto_enum ã¯é£ãããã§ãããã
çµè«ã ãè¨ãã¨ãEnumerable#select ãã©ããªé¢¨ã« to_enum ãã¦ããç®æ¨ã®æåã¯éæã§ãã¾ãããã§ããªãã¯ãã§ãããã¶ãã
ã©ãããã°ãããã¨ããã¨ã以ä¸ã®ããã« Enumerable#select ã使ãã Enumerable.new ã§æ¸ãã°ãã (æ¸ããããªã) ã§ãã
module Enumerable def selector(&blk) Enumerator.new do |e| each do |x| e << x if blk[x] end end end end
ãããããã¡ãã¡ãããªã®ãå®ç¾©ããã®ã¯é¢åã§ãããã
enumerabler.rb
ããã§ãä¸è¨ã®ãããªå®ç¾©ãéããã©ã¤ãã©ãª enumerabler.rb ãä½ãã¾ããã
require "enumerabler" ary.selector {|x| x.even? }.take(10)
select ã®ä»£ããã« selector ã¨æ¸ãã¾ããselect ã¯é
åãè¿ãã¾ãããselector ã¯ããã«ç¸å½ãã Enumerator ãè¿ãã¾ããEnumerator ãªã®ã§ãè©ä¾¡ãé
å»¶ããã¦ãã¾ããä¸ã®ããã°ã©ã ã§ã¯ã10 åè¦ã¤ãã£ãæç¹ã§è©ä¾¡ãæ¢ã¾ãã¾ãã
enumerabler.rb ã¯ãEnumrable ã« grepper ãfinder_all (all_finder ãselector) ãrejecter ãcollector (mapper) ãflat_mapper (concat_collector) ãzipper ãtaker ãtaker_while ãdropper ãdropper_while ã追å ãã¾ã *1 ãã©ããã-er ã®ãªãã¡ã½ãããè¿ãé
åã«ç¸å½ãã Enumerator ãè¿ãã¾ãã
å人çã«ã¯ã-er ãä»ãã㨠Enumerator ãè¿ããã¨ãã convension ãæ°ã«å
¥ã£ã¦ãã¾ãã(èªåã§è¨ããª)
ãFiber ã使ãããé ãããããªãã®ï¼ã
ããããenumerabler.rb ã使ãã ãã§ã¯ãFiber ã®çæãå¼ã³åºãã¯ä¸åèµ·ããã¾ããããªãã ãæ°ã«ãªã人㯠Ruby ã®ã½ã¼ã¹ãèªãã§ãã ããã
ãã ããProc ã®å¼ã³åºãã夿°çºçããã®ã§ãé
ããã¨ã¯ç¢ºãã§ããã§ããä¸éé
åã®åã®æ¶è²»ã¡ã¢ãªéã¯æ¸ãã¾ãã
æ´»ç¨ä¾
p ary.selector {|x| x.even? }.taker(100).take_while {|x| x >= 0 }
âæåã«ç¾ãã 100 åã®å¶æ° (ãã ãè² ã®å¤ããã£ãã 100 åè¡ããªãã¦ãæã¡åã) ã¨ããæ½åºæä½ããç¡é§ãªåæãä¸éé åçæãªãã«è¡ãã
require "enumerabler" def sieve(e, &blk) yield n = e.first sieve(e.rejecter {|x| x % n == 0 }, &blk) end sieve(2..(1.0/0.0)) {|x| p x } #=> 2, 3, 5, 7, 11, 13, 17, 19, 23, ...
âã¨ã©ãã¹ããã¹ã®ç¯©ãrejecter ã使ã£ã¦ãã¾ãã
require "enumerabler" def fibonacci Enumerator.new do |e| e << 1 e << 1 fibonacci.zip(fibonacci.dropper(1)) {|x, y| e << x + y } end end fibonacci.each {|x| p x } #=> 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
âãã£ããããæ°åãdropper ã使ããã¨ã§ç¡éåã drop ã§ãã¾ãããã ããcall-by-name ãªã®ã¨ãzip ã¯ä¸ã§ Fiber ãå¼ã¶ã®ã§ãã¹ãã¼ãã¯ã¨ã¦ãé
ãã§ãã
*1:ä½è«ã§ããã-er 㨠-or ã®ä½¿ãåããããããªãã