我对reduce的语法有问题.我有以下格式的散列:

H = {"Key1" => 1, "Key2" => 2}

我想用reduce来求这个函数中的值之和.

差不多

H.reduce(0) {|memo, elem| memo+=elem}

我知道这是错误的.我不明白怎样才能使elem成为散列的值.

推荐答案

使用Enumerable#reduce,如果哈希恰好为空,则可以获得nil:

H.values.reduce(:+) # => 3
Hash.new.values.reduce(:+) # => nil

要在哈希为空时安全地获得0,请使用:

H.values.reduce(0) { |sum,x| sum + x } # or...
H.reduce(0) { |sum,(key,val)| sum + val } # ...if you need to inspect the key

这里有一个快速的基准,供大家参考.请注意,仅减少值似乎比减少键/值对中的值要快一些:

                               user     system      total        real
H.values.reduce(:+)        4.510000   0.080000   4.590000 (  4.595229)
H.values.reduce(0) {...}   4.660000   0.080000   4.740000 (  4.739708)
H.reduce(0) {...}          5.160000   0.070000   5.230000 (  5.241916)
require 'benchmark'

size = 1_000
hash = Hash[* Array.new(size*2) { rand } ]

N=10_000
Benchmark.bm(24) do |x|
  x.report('H.values.reduce(:+)')      { N.times { hash.dup.values.reduce(:+) } }
  x.report('H.values.reduce(0) {...}') { N.times { hash.dup.values.reduce(0) { |sum,x| sum + x } } }
  x.report('H.reduce(0) {...}')        { N.times { hash.dup.reduce(0) { |sum,(_,v)| sum + v } } }
end

Ruby相关问答推荐

整数除以负数

如果 Java 人go Scala,C# go F#,那么 Ruby 人go 哪里寻求函数式?

bundler 可以告诉我 Gemfile 中的哪些 gem 有更新的版本

Ruby:子字符串到一定长度,也到子字符串中的最后一个空格

检测安装的 CPU 数量

创建一个哈希值作为数组和默认值作为空数组

Ruby 中是否有像 C 中一样的主要方法?

C# ?? Ruby 中的运算符?

比较ruby中的两个字符串

如何通过一组新的给定键更改哈希的所有键

to_a 和 to_ary 有什么区别?

RSpec allow/expec vs expect/and_return

从类对象获取类位置

在 Ruby 中获取本月的最后一天

ruby 中&:运算符的功能是什么?

rbenv install --list 不列出 2.1.2 版本

判断散列的键是否包含所有键集

在类方法中使用实例变量 - Ruby

如何在没有警告的情况下重新定义 Ruby 常量?

*nix 是什么意思?