我对此有点挣扎:我需要一个函数,该函数采用 fun(Any*) 类型的任何函数:布尔值作为参数,评估函数并返回真或假,具体取决于函数评估的成功与否。
本质上,我需要的是一个函数类型,它允许任何数字和任何类型的参数,但该函数必须返回布尔值。
这将允许我编写如下函数:
def checkLenght(str : String, length : Int) : Boolean ={
if (str.lenght == length)}
或者
def ceckAB(a : Int, b : Int) : Boolean = {
if(a < b && a >= 23 && b < 42) }
这样,例如
eval(checkLenght(abc, 3)) //returns true
eval(ceckAB(4,1)) // returns false
我想,一个函数类型:
type CheckFunction = (Any*) => Boolean
可能会成功,但我很难编写通用的 eval 函数。
有什么建议吗?
谢谢
解决方案:
该函数需要 1) 返回类型为 Boolean 的另一个函数:"(func : => Boolean)" 2) 返回类型为 Boolean ":Boolean" 3) 返回传递的函数参数的值:" = func"
总的功能是:
def eval(func : => Boolean) : Boolean = func
再次让我惊讶的是,Scala 中的事情是多么简单。
正如评论所指出的,这是一个相当不寻常的功能,没有明显的意义。简单说一下根本原因。
动机:
有很多关于潜在动机的问题,所以这里简短总结一下为什么需要这样的功能。
本质上,有两个原因。
第一个是将故障处理从函数本身移到处理函数中。这保留了检查功能的纯度,甚至允许重用通用检查。
其次,这都是关于“可插拔故障处理”的。这意味着, eval 函数仅告知是否发生了故障(或未发生)。如果发生故障,则通过接口调用处理程序。可以根据需要使用配置文件交换处理程序的实现。
为什么?
交换配置文件意味着,我像往常一样编码我的检查和功能,但是通过切换配置文件,我切换处理程序,这意味着我可以在句号、控制台打印输出、电子邮件警报、SNMP 通知、推送消息之间进行选择... . 为此,我需要将检查函数与其评估和处理分离。这就是这种看起来相当奇怪的 eval 函数的动机。
为了完整起见,我已经实现了所有这些东西,但是我是否面临只处理琐碎检查的限制,即 check(Boolean*) 这很简洁,但我通常更愿意编写一个函数来进行更复杂的检查。
解决了
该函数是通过返回传递函数的值来定义的:
def eval(func : => Boolean) : Boolean = {func}