From: ruby-core@... Date: 2014-04-10T14:41:21+00:00 Subject: [ruby-core:61947] [ruby-trunk - Bug #9723] [Rejected] #size does not trigger evaluation of lazy enumerator. Issue #9723 has been updated by Marc-Andre Lafortune. Status changed from Open to Rejected Assignee set to Marc-Andre Lafortune The purpose of `size` is to return the number of elements yielded by an Enumerator without consuming it, i.e. without iterating it. If `enum.size` returns an integer, than `enum.size == enum.to_a.size` must be true. In your first example, `size` would have to return 2, which is not possible to do lazily. Use `count` to do an actual count. ---------------------------------------- Bug #9723: #size does not trigger evaluation of lazy enumerator. https://bugs.ruby-lang.org/issues/9723#change-46145 * Author: Zeke Fast * Status: Rejected * Priority: Normal * Assignee: Marc-Andre Lafortune * Category: core * Target version: * ruby -v: 2.1.1 * Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN ---------------------------------------- Here is the code which shows weird behariour ### Steps to reproduce `$ irb 2.1.1 :001 > [1, 2, 3].lazy.select{ |e| e%2 == 1}.size => nil 2.1.1 :002 > [1, 2, 3].lazy.select{ |e| e%2 == 1}.to_a => [1, 3] 2.1.1 :003 > [1, 2, 3].lazy.size => 3` ### Expected `[1, 2, 3].lazy.select{ |e| e%2 == 1}.size` to return number of elements like `[1, 2, 3].lazy.size` did. ### Actual `[1, 2, 3].lazy.select{ |e| e%2 == 1}.size` returns **nil**. ### Environment Ruby: ruby 2.0.0p457 (2014-03-03) [x86_64-linux-gnu] RVM: rvm 1.25.22 (stable) by Wayne E. Seguin , Michal Papis [https://rvm.io/] OS: Linux xxxxxx 3.13-1-amd64 #1 SMP Debian 3.13.7-1 (2014-03-25) x86_64 GNU/Linux -- https://bugs.ruby-lang.org/