Project

General

Profile

Actions

Bug #9723

closed

#size does not trigger evaluation of lazy enumerator.

Added by zekefast (Zeke Fast) about 10 years ago. Updated about 10 years ago.

Status:
Rejected
Target version:
-
ruby -v:
2.1.1
[ruby-core:61942]

Description

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

Updated by marcandre (Marc-Andre Lafortune) about 10 years ago

  • Status changed from Open to Rejected
  • Assignee set to marcandre (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.

Actions

Also available in: Atom PDF

Like0
Like0Like0