Ruby 2.7 — Enumerable#tally

栏目: Ruby · 发布时间: 6年前

内容简介:圣诞节已经过去,2.6已经发布,现在是时候无情叫卖 2.7 版本的发布页面,这样我们就可以开始我们有趣的「关于即将推出的功能」的年度博客传统。通常这意味着另一个 12 月的发布,但是如果它们能在今年年初合并到主干,则有一些方法例子可以更早的制作。这次我们有了新的方法

圣诞节已经过去,2.6已经发布,现在是时候无情叫卖 2.7 版本的发布页面,这样我们就可以开始我们有趣的「关于即将推出的功能」的年度博客传统。

通常这意味着另一个 12 月的发布,但是如果它们能在今年年初合并到主干,则有一些方法例子可以更早的制作。

这次我们有了新的方法 Enumerable#tally

简单版

tally 计数:

[1, 1, 2].tally
# => { 1 => 2, 2 => 1 }
[1, 1, 2].map(&:even?).tally
# => { false => 2, true => 1 }

例子

Ruby 官方测试代码中使用的示例:

[1, 2, 2, 3].tally
# => { 1 => 1, 2 => 2, 3 => 1 }

没有块(Block), tally 计算 Enumerable 类型中每个元素的出现次数,如果我们将它应用于另一种类型的列表,它可能会更清楚一些:

%w(foo foo bar foo baz foo).tally
=> {"foo"=>4, "bar"=>1, "baz"=>1}

目前 tally_by 尚未被接受到核心,因此要通过函数计算,您将首先使用 map:

%w(foo foo bar foo baz foo).map { |s| s[0] }.tally
=> {“f” => 4, “b” => 2}

目前正在 讨论 接受此功能,这将产生上述语法:

%w(foo foo bar foo baz foo).tally_by { |s| s[0] }
=> {“f” => 4, “b” => 2}

为何使用?

如果您一直在使用 Ruby,那么您可能已经使用类似其中一些代码来做 tally 类似的上述事情:

list.group_by { |v| v.something }.transform_values(&:size)
list.group_by { |v| v.something }.map { |k, vs| [k, vs.size] }.to_h
list.group_by { |v| v.something }.to_h { |k, vs| [k, vs.size] }
list.each_with_object(Hash.new(0)) { |v, h| h[v.something] += 1 }

可能还有其他几种变体,但这些是您可能会看到的一些更常见的变体。这是一种非常优雅的方法在 Ruby 语言中缩写非常常见的方言,也是一种非常受欢迎的方法。

Vanilla Ruby Equivalent

这种方法有什么作用?好吧,如果我们要在普通的 Ruby 中实现它,它可能看起来像这样:

module Enumerable
  def tally_by(&function)
    function ||= -> v { v }
    
    each_with_object(Hash.new(0)) do |value, hash|
      hash[function.call(value)] += 1
    end
  end
  
  def tally
    tally_by(&:itself)
  end
end

在没有提供函数的情况下,它会通过 itself 有效统计,或者更确切地说是标识函数。

标识函数是返回给定内容的函数。如果你给它 1 ,它会返回 1 。如果你给它 true ,它会返回 true 。Ruby 也在一个名为 itself 的方法中使用了这个概念。

本文不会深入讨论上述代码的作用。第五部分 “ Reducing Enumerable ” 更详细地介绍了此代码。

源代码

Nobu 最近提交了一个 Ruby 核心补丁来添加这个方法:

enum.c: Enumerable#tally · ruby/ruby@673dc51

https://github.com/ruby/ruby/...

它被 Ruby 核心团队接受,名为 tally

Feature #11076: Enumerable method count_by - Ruby trunk - Ruby Issue Tracking System

https://bugs.ruby-lang.org/is...

Tally?

让我们从这个词的含义开始:

A tally is a record of amounts or numbers which you keep changing and adding to as the activity which affects it progresses.

https://www.collinsdictionary...

这个名字来自哪里?最初提出来的名字是 count_by ,但名称被拒绝,因为它和 count 方法有不同的返回类型和行为。

在从 Tahoe 地区和 RailsCamp West 回来的车上,我们(我自己, DavidStephanieShannon )正在讨论可能备用的名称,试图看看该函数是否可以有不同的名字。

David 并正式提出 tally 并建议。看起来取名字卡住了,代码已合并到主干中。

现在我在几个会议上发表了演讲,并决定在我的 RubyConf 演讲中的一节中用 tally_by 替代 count_by 。文字版在这里:

Reducing Enumerable — Part Five: Cerulean, Master of Tally By

https://medium.com/@baweaver/...

只是一些有趣的背景故事。

Wrapping Up

2.7 正在路上,让我们看看它会带来什么!我很期待看到 Ruby 从这里走出去。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Coding the Matrix

Coding the Matrix

Philip N. Klein / Newtonian Press / 2013-7-26 / $35.00

An engaging introduction to vectors and matrices and the algorithms that operate on them, intended for the student who knows how to program. Mathematical concepts and computational problems are motiva......一起来看看 《Coding the Matrix》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具