Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Crystal lang 如何在晶体中传递块的方法_Crystal Lang - Fatal编程技术网

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))