gpt4 book ai didi

ruby - 使用散列来区分正数、奇数、偶数和负数

转载 作者:太空宇宙 更新时间:2023-11-03 17:15:09 25 4
gpt4 key购买 nike

我有一个数组:

    ak = [10, 20, 3, 4, 5, -5, 28, 27]

我想要这样的解决方案:

    #even:4
#odd:3
#positive:7
#negative:1

我如何使用哈希来做到这一点?

最佳答案

您可以按如下所示以相当通用(可重用)的方式执行此操作。

代码

def analyze_array(ak, ops)
ops.each_with_object({}) { |(k,m),h| h.update(k=>ak.count(&m)) }
end

示例

ak = [10, 20, 3, 4, 5, -5, 28, 27]

ops = [[:even, :even? ],
[:odd, :odd? ],
[:positive, ->(n) { n>0 }],
[:negative, ->(n) { n<0 }]]

analyze_array(ak, ops)
#=> {:even=>4, :odd=>4, :positive=>7, :negative=>1}

解释

对于上面的例子:

enum = ops.each_with_object({})
#=> #<Enumerator: [[:even, :even?], [:odd, :odd?],
# [:positive, #<Proc:0x007fe90395aaf8@(irb):9 (lambda)>],
# [:negative, #<Proc:0x007fe90395aaa8@(irb):10 (lambda)>]]
# :each_with_object({})>

请注意 :even?:odd? 是符号(不要与方法混淆)。

enum 的元素通过 Enumerator#each 传递到 block 中,它调用 Array#each .我们可以通过将 enum 转换为数组来查看其元素是什么:

enum.to_a
#=> [[[:even, :even?], {}], [[:odd, :odd?], {}],
# [[:positive, #<Proc:0x007fe90395aaf8@(irb):9 (lambda)>], {}],
# [[:negative, #<Proc:0x007fe90395aaa8@(irb):10 (lambda)>], {}]]

并模拟将 enum 的 (4) 元素传递到带有 Enumerator#next 的 block 中. enum 的第一个元素 ([[:even, :even?], {}]) 被传递给 block 并分配给 block 变量:

(k,m),h = enum.next
#=> [[:even, :even?], {}]
k #=> :even
m #=> :even?
h #=> {}

接下来,我们使用 Hash#update (又名 merge!)将一键散列合并到 h 并返回 h 的新值:

h.update(k=>ak.count(&m))
#=> {}.update(:even=>[10, 20, 3, 4, 5, -5, 28, 27].count(&:even?))
#=> {:even=>4}

(Ruby 允许我们编写 (k=>ak.count(&m)) 作为 ({k=>ak.count(&m)}) 的简写).

像往常一样,& 调用 Symbol#to_proc将符号 :even? 转换为 proc,然后将 proc 转换为 count 的 block 。

enum 的下一个值随后被传递给 block (“奇数”),执行类似的计算并合并散列 { :odd=>4 }进入 h,导致:

h #=> { :even=>4, :odd=>4 }

然后将 enum 的第三个和第四个值传递给 block 。唯一的区别是 ak.count(&m) 中的 m 已经是一个 proc(实际上是一个 lambda),所以 & 只是将它转换到 count 的 block 。

关于ruby - 使用散列来区分正数、奇数、偶数和负数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29736146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com