我正在尝试将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)