Ruby 2.7 — Enumerable#tally

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

内容简介:圣诞节已经过去,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 从这里走出去。


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

查看所有标签

猜你喜欢:

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

编程之法

编程之法

July / 人民邮电出版社 / 2015-9-1 / 49.00元

本书涉及面试、算法、机器学习三个主题。书中的每道编程题目都给出了多种思路、多种解法,不断优化、逐层递进。本书第1章至第6章分别阐述字符串、数组、树、查找、动态规划、海量数据处理等相关的编程面试题和算法,第7章介绍机器学习的两个算法—K近邻和SVM。此外,每一章都有“举一反三”和“习题”,以便读者及时运用所学的方法解决相似的问题,且在附录中收录了语言、链表、概率等其他题型。书中的每一道题都是面试的高......一起来看看 《编程之法》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换