Crystal lang 如何在晶体中传递块的方法
如何将Crystal lang 如何在晶体中传递块的方法,crystal-lang,Crystal Lang,如何将plus传递到calculate方法 def calculate(&block : (Float64, Float64) -> Float64) block.call(1.1, 2.2) end def plus(a, b) a + b end calculate{|a, b| plus a, b} 这行不通 calculate ->plus calculate &plus 附言 另一个问题,如何使它适用于所有数字?不仅仅是Float64。此代码
plus
传递到calculate
方法
def calculate(&block : (Float64, Float64) -> Float64)
block.call(1.1, 2.2)
end
def plus(a, b)
a + b
end
calculate{|a, b| plus a, b}
这行不通
calculate ->plus
calculate &plus
附言
另一个问题,如何使它适用于所有数字?不仅仅是Float64
。此代码不会编译并抱怨需要比Number
def calculate(&block : (Number, Number) -> Number)
block.call(1, 2)
end
理想情况下,最好将其推广到typeof(block.call(1,2))=>Int32
和typeof(block.call(1.1,2.2))=>Float64
如何将加进计算方法
你在找什么
calculate(&->plus(Float64, Float64))
其中->plus(Float64,Float64)
返回一个Proc
。请注意,您必须指定参数的类型-请参阅参考手册中的部分
如何使其适用于所有数字
我将查看所有的
-请参阅参考手册中关于的部分。通用解决方案可以使用自由变量,但有一个问题,因为自由变量不能从块参数派生:
def calculate(&block : (T, T) -> T) forall T # Error: undefined constant T
这是因为块参数不能重载,因为它们可以在没有类型限制的情况下被捕获
有两种方法可以实现这一点:
您可以将T
的类型作为参数显式传递。这有点冗长,但适用于捕获的块参数
您可以将捕获的块参数更改为接收Proc
的普通参数:
谢谢实际上,我想要一个普通的参数,我把&
添加到Proc
中,因为我认为它应该是这样的:)。
def plus(a, b)
a + b
end
def calculate(t : T.class, &block : (T, T) -> T) forall T
block.call(1.1, 2.2)
end
calculate(Float64, &->plus(Float64, Float64))
def plus(a, b)
a + b
end
def calculate(block : (T, T) -> T) forall T
block.call(1.1, 2.2)
end
calculate(->plus(Float64, Float64))