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
如您所见,对于 each
和 map
,单个参数被分配给 [key, value]
数组,但是对于select
和reject
,参数只有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/