在Ruby中有一个类inherit Proc

在Ruby中有一个类inherit Proc,ruby,inheritance,lambda,proc,Ruby,Inheritance,Lambda,Proc,我一直试图在Ruby中继承Proc类。我知道有很多其他方法可以实现我的类,而不必实际继承Proc,但现在出于好奇我想知道 我想要一个没有作为参数传递的块就可以实例化的类,但它就是不起作用(这似乎是原因)。很明显,如果没有块,就不能实例化实际的Proc(即使是Proc或lamba): 我假设重写initialize可能正好达到目的,但实际上,即使重写new也不行: class MyClass < Proc def new *args, &block super { |x|

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

我想要一个没有作为参数传递的块就可以实例化的类,但它就是不起作用(这似乎是原因)。很明显,如果没有块,就不能实例化实际的
Proc
(即使是
Proc
lamba
):

我假设重写
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
class MyClass一切都很好
MyClass.new“hello”#=>ArgumentError:试图创建没有块的过程对象

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

super
没有参数列表意味着“传递原始参数”。在本例中,原始参数是字符串
“hello”
,它被传递到
Proc::new
,但它不接受参数

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

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

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

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

好吧,这实际上让很多事情变得有意义!谢谢!您可以编写
def self.new*.
来提请注意您没有使用参数这一事实。@CarySwoveland:实际上,Ruby允许您在忽略参数时根本不命名参数:
def self.new(*)
。我想,OP希望以某种方式使用参数,但现在你是对的。当我这么做的时候,我完全可以做得过火,做
super(&2.method(:*))
:-DI不知道这一点。学到了一些东西。为什么重载
new
而不是
initialize
class MyClass < Proc
  def self.new(*)
    super() {|x| 2 * x }
  end
end

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