内容简介:圣诞节已经过去,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 回来的车上,我们(我自己, David , Stephanie 和 Shannon )正在讨论可能备用的名称,试图看看该函数是否可以有不同的名字。
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
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》 这本书的介绍吧!