[ruby-core:74909] Re: [Ruby trunk Feature#12080] Enumerable#first, Array#last with block

From: Alec Larsen <alec.larsen@...>
Date: 2016-04-12 21:30:05 UTC
List: ruby-core #74909
I think that's a great idea.

On Tue, Apr 12, 2016 at 8:42 AM <k@rhe.jp> wrote:

> Issue #12080 has been updated by Kazuki Yamaguchi.
>
> File v2-0001-Enumerable-Array-Range-first-Array-Range-last-wit.patch added
>
> ping... Any thoughts?
> (updated patch to apply successfully to the current trunk)
>
> ----------------------------------------
> Feature #12080: Enumerable#first, Array#last with block
> https://bugs.ruby-lang.org/issues/12080#change-58019
>
> * Author: Kazuki Yamaguchi
> * Status: Open
> * Priority: Normal
> * Assignee:
> ----------------------------------------
> I propose a new feature: {Enumerable,Array,Range}#first,
> {Array,Range}#last with block.
>
> If no argument is passed:
>
> * `enum.first { block }` works as the same as `enum.find { block }`
> * `ary.last { block }` works as the same as `ary.reverse_each.find { block
> }`
>
> If a integer is passed:
>
> * `enum.first(n) { block }` works as the same as `enum.lazy.select { block
> }.first(n)`
> * `ary.last(n) { block }` works as the same as
> `ary.reverse_each.lazy.select { block }.first(n).reverse`
>
> Examples:
>
> ~~~ruby
> ary = [1, 2, 3, 4, 5, 6]
> ary.first    { |i| i.even? } #=> 2
> ary.first(2) { |i| i.even? } #=> [2, 4]
>
> ary.last     { |i| i.odd? }  #=> 5
> ary.last(2)  { |i| i.odd? }  #=> [3, 5]
> ~~~
>
> Currently these methods just ignore given blocks.
>
> ~~~ruby
> ary.first { |i| i > 3 } #=> 1
> ~~~
>
> ---
>
> I sometimes write such code:
>
> ~~~ruby
> ary = ["DEBUG: a", "WARN: b", ..., "WARN: y", "DEBUG: z"] # assume a large
> Array
> ary.reverse_each.lazy.reject { |line| line.include?("DEBUG")
> }.first(10).reverse #=> returns last 10 non-debug logs
> ~~~
>
> But this is redundant and not intuitive. In this case, I just want the
> last 10 logs which is not debug message in the original order.
> With the new Array#last, I can refactor it:
>
> ~~~ruby
> ary.last(10) { |line| !line.include?("DEBUG") }
> ~~~
>
> I think this represents what I want to do much more clearly.
>
>
> ---Files--------------------------------
> 0001-Enumerable-Array-Range-first-Array-Range-last-with-b.patch (11.5 KB)
> v2-0001-Enumerable-Array-Range-first-Array-Range-last-wit.patch (14 KB)
>
>
> --
> https://bugs.ruby-lang.org/
>
> Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
> <http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>
>

Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>

In This Thread

Prev Next