gpt4 book ai didi

ruby - 转发迭代器

转载 作者:行者123 更新时间:2023-12-03 23:48:54 24 4
gpt4 key购买 nike

我有课(为了讨论,高度简化)

class MyClass
def initialize
@myrecs = %w(a b c d)
end
def each_rec
@myrecs.each {|r| yield(r)}
end
end

并将其用作
x = MyClass.new
x.each_rec { |r| .... }

由于我的方法 each_rec基本上只做 myrecs.each ,我想以某种方式定义 each_rec只转发到 each .我可以通过显式传递 block 来达到预期的效果,即
def each_rec(&block)
@myrecs.each(&block)
end

但我想知道是否也可以在不将 block 作为显式参数的情况下实现我的目标。我尝试了以下方法但没有成功:

(1) 利用 each在没有 block 的情况下调用时返回一个 Enumerator:
  def each_rec
@myrecs.each
end

(2) 创建一个枚举器:
   def each_rec
@myrecs.enum_for(:each)
end

在这两种情况下,我都没有收到错误,但 block 传递给 each_rec根本没有进入。

最佳答案

在 Ruby 中,如果您调用 Proc.new 如果在接收 block 的方法中没有 block ,它将将该方法传递的 block 转换为 proc。所以,你可以这样做:

class MyClass
def initialize
@myrecs = %w(a b c d)
end
def each_rec
@myrecs.each(&Proc.new)
end
end

x = MyClass.new
x.each_rec { |r| puts r }

现在,您的 each_rec 不再需要显式参数了。方法。但是,现在您必须为该方法提供一个 block ,或者得到一个 ArgumentError(“试图在没有 block 的情况下创建 Proc 对象”)。我们可以用一个保护子句来解决这个问题:
def each_rec
return @myrecs.each unless block_given?

@myrecs.each(&Proc.new)
end

现在可以像 each 一样使用它:
x = MyClass.new
x.each_rec { |r| p r }
x.each_rec.with_index { |r, i| p [r, i] }

关于ruby - 转发迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60564317/

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