At Sun, 10 May 2009 08:53:31 +0900,
NARUSE, Yui wrote:
ã‚ãŸã—ã‚‚ãƒãƒƒãƒ•ã‚¡ã‚’用æ„ã—ã¦ãƒ¼ã¨ã„ã†ã®ã¯è€ƒãˆãŸã®ã§ã™ãŒã€
ç”°ä¸ã•ã‚“ã®gather_eachã§å¯èƒ½ãªã“ã¨ãŒã€
gather_eachより複雑ã«ãªã£ã¦ã—ã¾ã£ãŸã‚‰ãƒ€ãƒ¡ãªã‚“ã˜ã‚ƒãªã„ã§ã™ã‹ã。
 gather_each ã§å¯èƒ½ãªã“ã¨ã€ã¤ã¾ã‚Š gather_each ã®çµæžœãŒãã®ã¾ã¾
ユーザãŒå¾—ãŸã„最終çµæžœã¨ãªã‚‹ã‚±ãƒ¼ã‚¹ã¯å分ã«å¤šã„ã®ã§ã—ょã†ã‹ã€‚
 パラグラフã®ã‚ˆã†ã«åŒè³ªã®ã‚‚ã®ã®ç¹°ã‚Šè¿”ã—ãªã‚‰ã´ã£ãŸã‚Šã§ã™ãŒã€ãã†
ã§ãªã„å ´åˆã¯ã€åˆ†å‰²ã•ã‚ŒãŸå€‹ã€…ãŒä½•ã§ã‚ã‚‹ã‹ã¨ã„ã†æƒ…å ±ãŒå¤±ã‚ã‚Œã¦ã„ã‚‹
ã®ã§å‡¦ç†ã®ä¸‹æµã§å†ã³æ¤œæŸ»ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“よã。ã¾ãŸã€æ¨ã¦ã‚‹
機能も必è¦ãªã“ã¨ãŒå°‘ãªããªã„ã¨æ€ã„ã¾ã™ã€‚
 ãŠãらããれらã¯å®ˆå‚™ç¯„囲外ã¨ã™ã‚‹ã®ã§ã—ょã†ãŒã€ç¯„囲内ã¨ã—ã¦ã„ã‚‹
部分ãŒå分ã«åºƒã„ã®ã‹ã€ãã—ã¦å®Ÿéš›ã®å¿œç”¨ãƒ‹ãƒ¼ã‚ºã¨ã®é–“ã«éš™é–“ã¯ãªã„ã‹
ã¨ã„ã†ç–‘å•ã‚’æŒã£ã¦ã„ã¾ã™ã€‚ãã‚ŒãŒãƒžãƒƒãƒã™ã‚‹ã®ãªã‚‰ã€é©åˆ‡ãªåå‰ã§
è¿½åŠ ã™ã‚Œã°ã„ã„ã¨æ€ã„ã¾ã™ã€‚
ç”°ä¸ã•ã‚“ã®gather_eachã§ã§ãã‚‹ã“ã¨ã¯ã€ã“れ以上概念を増やã•ãš
ã»ã¼åŒç‰ã®è¨˜è¿°é‡ã§ã“ãªã›ã¤ã¤ã€è‡ªç”±åº¦ã‚‚ã‚ã’られãªã„ã¨ã„ã‘ãªã„ã®ã‹ãªã¨ã€‚Rubyãªã‚“ã§Bufferã¿ãŸã„ãªæ¦‚念を導入ã—ã¦ã‚‚æ„外ã¨ã™ã£ãã‚Šã™ã‚‹ã‚“ã§ã™ãŒã€
ãã“ã§ç”˜ãˆã¡ã‚ƒã„ã‘ãªã„ã‚“ã˜ã‚ƒãªã„ã‹ã¨æ€ã†ã®ã§ã™ã‚ˆã€‚ã¨ã„ã†ã‹ã€ã“ã‚Œã£ã¦ãƒãƒƒãƒ•ã‚¡ã¯åˆ¥ã«æä¾›ã—ã¦ã€
Enumerable版injectã§ã‚„ã‚‹ã¹ããªæ°—ã‚‚
 ãã‚Œã¯ä¸€ã¤ã‚ã‚‹ã‚“ã§ã™ãŒã€ yield ã‚’ä¿ç•™ã—ã€ã©ã“ã‹ã®ã‚¿ã‚¤ãƒŸãƒ³ã‚°ã§
明示的ã«æŒ‡å®šã—ãŸã‚‚ã®ã‚’ yield ã™ã‚‹ã¨ã„ã†æ©Ÿèƒ½ãŒè¦æ±‚ã•ã‚Œã‚‹ã®ã§ã€
yielder ãªã‚Šãれを包å«ã™ã‚‹ buffer ãªã‚Šã‚’渡ã™ã¨ã„ã†APIã¯å¿…è¦ã ã¨
æ€ã„ã¾ã™ã€‚
 ã¨ãã©ã select 㨠map を連çµã•ã›ã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ãŒã€ãれを
ã„ã£ãºã‚“ã«å¯èƒ½ã«ã™ã‚‹æ©Ÿèƒ½ã¯ã»ã—ã„ã¨æ€ã£ã¦ã„ã¾ã™ã€‚ãŸã¨ãˆã°ã“ã‚“ãª
æ„Ÿã˜ã§ã™ã€‚
module Enumerable
def with_yielder(&block)
Enumerator.new { |yielder|
each { |x|
block.call(x, yielder)
}
}
end
end
# æ•´æ•°ã®æ›¸ã„ã¦ã‚る行を抽出ã—ã€æ•°åˆ—ã«ã™ã‚‹
p "abc\n123\n\n456\ndef\n".lines.with_yielder { |line, yielder|
if m = /^([+\-]?\d+)$/.match(line)
yielder << m[1].to_i
end
}.to_a #=> [123, 456]
 ã“ã‚Œã®å‰ã« with_object({}) ã§ãƒãƒƒãƒ•ã‚¡ã‚„ステータスをå–ã‚‹ãŸã‚ã®
é ˜åŸŸã‚’ä»˜åŠ ã™ã‚Œã°ã€ãƒ¡ã‚½ãƒƒãƒ‰ãƒã‚§ãƒ¼ãƒ³ã§ãƒãƒƒãƒ•ã‚¡ã‚’実装ã§ãã¾ã™ã。
currentã‚’èªã¿æ¨ã¦ã‚Œã°ã„ã„ã ã‘ãªã®ã§å…¨ãåŒã˜ã‚³ãƒ¼ãƒ‰ã§å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚
 ã“ã‚Œã¯ã‚ˆã•ãã†ã§ã™ã€‚