gpt4 book ai didi

ruby - 让一个类继承 Ruby 中的 Proc

转载 作者:太空宇宙 更新时间:2023-11-03 18:11:59 26 4
gpt4 key购买 nike

我一直在尝试继承Ruby 中的Proc 类。我知道有很多其他方法可以在不实际继承 Proc 的情况下实现我的类,但现在我出于好奇想知道。

我想要一个可以在没有 block 作为参数传递的情况下实例化的类,但它只是行不通(this 似乎是原因)。很明显,您不能在没有 block 的情况下实例化实际的 Proc(即使使用 proclamba):

Proc.new proc {|x| 2 * x } # => ArgumentError: tried to create Proc object without a block
Proc.new lambda {|x| 2 * x } # => ArgumentError: tried to create Proc object without a block

我假设重写 initialize 可能就可以解决问题,但实际上即使重写 new 也行不通:

class MyClass < Proc
def new *args, &block
super { |x| 2 * x }
end

def initialize *args, &block
super { |x| 2 * x }
end
end

MyClass.new { |x| 2 * x } # => everything is fine
MyClass.new "hello" # => ArgumentError: tried to create Proc object without a block

有没有办法(从 Ruby 内部)绕过 proc.c 中的限制? ?或者任何优雅的解决方法?

最佳答案

super 没有参数列表意味着“传递原始参数”。在这种情况下,原始参数是字符串 "hello",它被传递给 Proc::new,但它没有参数!

解决方法是显式地不传递任何参数:

class MyClass < Proc
def self.new(*)
super() {|x| 2 * x }
end
end

m = MyClass.new "hello"
m.(23) # => 46

显然, block 不算作参数列表。您每天都会学到新东西。

关于ruby - 让一个类继承 Ruby 中的 Proc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32364402/

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