如何在Crystal中传递方法来阻止

Ale*_*hin 3 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}
Run Code Online (Sandbox Code Playgroud)

这行不通

calculate ->plus
calculate &plus
Run Code Online (Sandbox Code Playgroud)

聚苯乙烯

另一个问题,如何使它适用于所有数字?不只是Float64。此代码不会编译并抱怨需要比Number

def calculate(&block : (Number, Number) -> Number)
  block.call(1, 2)
end
Run Code Online (Sandbox Code Playgroud)

理想情况下,最好将其泛化,以便typeof(block.call(1, 2)) => Int32typeof(block.call(1.1, 2.2)) => Float64

小智 5

如何将加号传入计算方法?

您正在寻找

calculate(&->plus(Float64, Float64))
Run Code Online (Sandbox Code Playgroud)

哪里->plus(Float64, Float64)返回一个Proc. 请注意,您必须指定参数的类型 - 请参阅参考手册中的From 方法部分。

如何使它适用于所有数字?

我会调查forall- 请参阅参考手册中有关自由变量的部分。