在用 Java 或 C++ 编程时,我多次遇到过一个简单的模式,其中自定义控制结构可以减少我代码中的样板。它是这样的:
if( Predicate ){
Action
return Value
}
也就是说,一个“return if”类型的语句。我试过用签名来制作函数,比如
foo[A,B]( pred:((A,A)=>Boolean), value:Option[B] )
但随后我会检查我是否返回了 Some 或 None 。我被 return
绊倒了陈述。是否有一种继承方式可以用函数式语言或更具体地说是 Scala 来制作这样的控制结构?
编辑:
我的描述不是很清楚,这让试图帮助我的人感到困惑。关键原因我的
foo
不起作用的是它不能短路包含函数的评估。那是def intersect( geometry:Geometry, reference:Geometry ):Geometry = {
return_if( withinBounds( geometry, projection ), logToString( logger, "Geometry outside " + projection.toString ), EmptyGeometry() )
return_if( topologicallyCorrect( geometry ), intersect( correct( geometry ), reference )
//rest of the function
}
并且仍然允许在
return_if
内进行尾递归.
最佳答案
我会使用偏函数:
def whatevs[A, B](options : PartialFunction[(A,A), B]) : Option[B] = {
val myInput = generateInput
if(options.isDefined(myInput)) {
Some(options(myInput))
} else None
}
那么您的用法可能如下所示:
whateves {
case (x,y) if x > y => "Biggerz"
case (x,y) if y > x => "Tiny!"
}
通常,您不需要 return 语句。 If-expression 将计算为每个块中使用的最后一个表达式。您可能需要帮助编译器找出 if 表达式的类型结果,但不需要返回。
偏函数是一种在某些条件成立时执行操作的机制。在上面,两个条件是 x > y 或 y > x 来自元组。
如果 whatevs 函数不是你所说的,我建议使用原始模式匹配。
关于scala - Scala 中的自定义控制结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3575780/