让一个类继承Ruby中的Proc

时间:2015-09-02 22:49:41

标签: ruby inheritance lambda proc

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

我想要一个可以在没有作为参数传递的块的情况下实例化的类,但它只是不起作用(this似乎是原因)。很明显,您无法在没有阻止的情况下实例化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中的限制?或者任何优雅的解决方法?

1 个答案:

答案 0 :(得分:3)

没有参数列表的

super表示“传递原始参数”。在这种情况下,原始参数是字符串"hello",它被传递给Proc::new,但这不会带来参数​​!

修复是明确传递没有参数:

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

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

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