所以对于一个非常小的公式解释器,有人让我编码高尔夫,我想做一些类似的事情
val ops = Map("plus" -> + , "minus"-> -, "times"-> *, "div" -> / )
允许在关键字和它们描述的功能之间快速转换。这个语法不仅没有解析,而且我尝试的其他速记语法(
_ + _
, _:Int.+_
)都没有解析。有没有办法将其作为函数速记来执行,或者我是否注定要完全写出 lambda,从而破坏我的高尔夫成绩。编辑:有问题的问题只是整数。我知道,否则重载会使这变得更加困难。
最佳答案
不确定定义附加函数对您的分数有何影响。您可以使用以下方法解除运算符:
def lift(f:(Int,Int)=>Int) = f
val ops = Map("plus" -> lift(_+_), "minus" -> lift(_-_), "times"-> lift(_*_), "div" -> lift(_/_))
如果你想剃掉一些字符:
def ↑(f:(Int,Int)=>Int) = f
val ops = Map("plus" -> ↑(_+_), "minus" -> ↑(_-_), "times"-> ↑(_*_), "div" -> ↑(_/_))
正如 om-nom-nom 注释一样,编译器也可以通过提供类型签名来强制提升来完成这种显式提升:
val ops: Map[String, (Int,Int) => Int] = Map("plus" -> (_+_), "minus" -> (_-_), "times"->(_*_), "div" -> (_/_))
关于scala - 运算符作为函数字面量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19052806/