ruby - 哈希可枚举方法 : Inconsistent behavior when passing only one parameter

标签 ruby hash enumerable

Ruby 的 Hash 枚举方法需要 2 个参数,一个用于键,一个用于值:

hash.each { |键,值| ... }

但是,我注意到当您只传递一个参数时,可枚举方法之间的行为不一致:

student_ages = {
"Jack" => 10,
"Jill" => 12,
}

student_ages.each { |single_param| puts "param: #{single_param}" }
student_ages.map { |single_param| puts "param: #{single_param}" }
student_ages.select { |single_param| puts "param: #{single_param}" }
student_ages.reject { |single_param| puts "param: #{single_param}" }

# results:

each...
param: ["Jack", 10]
param: ["Jill", 12]

map...
param: ["Jack", 10]
param: ["Jill", 12]

select...
param: Jack
param: Jill

reject...
param: Jack
param: Jill

如您所见,对于 eachmap,单个参数被分配给 [key, value] 数组,但是对于selectreject,参数只有key

这种行为有什么特殊原因吗?文档似乎根本没有提到这一点;给出的所有示例都假设您传递两个参数。

最佳答案

刚刚检查了 Rubinius 的行为,它确实与 CRuby 一致。所以看看 Ruby 的实现 - 确实是因为 #select yields two values :

yield(item.key, item.value)

同时#each yields an array with two values :

yield [item.key, item.value]

向 block 生成两个值,该 block 期望一个值采用第一个参数并忽略第二个参数:

def foo
  yield :bar, :baz
end

foo { |x| p x } # => :bar

如果 block 有一个参数,则生成一个数组将被完全分配;如果有两个或多个参数,则将被解包并分配给每个单独的值(就像您一一传递它们一样)。

def foo
  yield [:bar, :baz]
end

foo { |x| p x } # => [:bar, :baz]

至于他们为什么做出这个决定 - 背后可能没有任何充分的理由,只是不希望人们用一个论点给他们打电话。

关于ruby - 哈希可枚举方法 : Inconsistent behavior when passing only one parameter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34865133/

相关文章:

c# - IEnumerable 没有 Count 方法

ruby-on-rails - Rails - 使用回形针上传 zip 文件并解压缩

ruby - 将方法应用于数组/可枚举中的每个元素

arrays - Ruby 迭代数组并在哈希中查找匹配项并替换数组中的元素

text - Swift如何将文本的哈希值数字转换回文本

c# - IEnumerable/Enumerable with Double/Int;初学者

ruby-on-rails - 算法建议——根据类别数据计算相关商店

ruby - Sinatra 和问号

performance - 用最少的辅助内存删除重复项?

ruby-on-rails - 如何在 ruby​​ 中使用 sort_by 按字母顺序对数组进行排序?