有可能将Proc传递到函数中吗?



我正在尝试将Ruby的函数组合运算符<<实现到Crystal的过程中。在Ruby中,它似乎非常直接。

def << block
proc { |*args| self.call( block.to_proc.call(*args) ) }
end
end

我也试过做类似的事情。

struct Proc
def <<(&block)
Proc.new { |*args, blk| call(block.call(*args, blk)) }
end
end

我试着用一个简单的加法器和子函数

来测试它
def add(x : Int32)
x + 1
end
def sub(x : Int32)
x - 1
end

但是,我得到这个错误。Error: wrong number of arguments for 'Proc(Int32, Int32)#<<' (given 1, expected 0)

我也试过改变<<以采取一个过程,但这也导致expected block type to be a function type, not Proc(*T, R)

我对这门语言有点陌生,所以我不太确定我缺少什么知识来理解为什么这不起作用。

您得到此错误是因为Proc未指定。Proc类型是泛型类型,需要用特定的泛型参数实例化,这些参数描述了它的形参类型和返回类型。

你可以通过一个最小的例子看到相同的行为:

Proc.new { 1 } # Error: expected block type to be a function type, not Proc(*T, R)

当然,错误信息并不能说明问题。


您尝试实现的工作示例可能如下所示:

struct Proc
def <<(block : Proc(*U, V)) forall U, V
Proc(*T, V).new { |arg| call(block.call(arg)) }
end
end
def add(x : Int32)
x + 1
end

def sub(x : Int32)
x - 1
end
x = ->add(Int32) << ->sub(Int32)
p! x.call(10)

相关内容

  • 没有找到相关文章

最新更新