gpt4 book ai didi

从 Integer#times 内调用的 Ruby yield 不返回评估 block

转载 作者:数据小太阳 更新时间:2023-10-29 08:27:32 25 4
gpt4 key购买 nike

有一个非常简单的问题,为什么我这样定义一个 block :

def test
yield
end

a=test{7} => a=7

然而当我这样定义一个 block 时

def test(n)

n.times{ yield }
end
a=test(4){7} => 4

为什么返回值变成n而不是yield?

最佳答案

它从 Integer#times 返回值(恰好与您调用该方法的数字相同 - 正如在 the Rubinius sourceRubySpec 上所见)而不是 block 返回值。

Integer#times多次调用该 block ,您基本上有两种选择:

  1. 将所有调用的结果合并到一个数组中并返回。

    def test(n)
    result = []
    n.times { |current| result << yield(current) }
    result
    end

    # Or, leveranging Enumerator#map:

    def test(n)
    n.times.map { |current| yield(current) }
    end

    # Or, still shorter, by forwarding the block:

    def test(n, &block)
    n.times.map(&block)
    end

    test(4) { |n| n * 2 } # => [0, 2, 4, 6]
  2. 将 block 返回的最后一个值存储在一个变量上,并返回它:

    def test(n)
    result = nil
    n.times { |current| result = yield(current) }
    result
    end

    test(4) { |n| n * 2 } # => 6

关于从 Integer#times 内调用的 Ruby yield 不返回评估 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20182646/

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