我有两个功能。一个是masterChecker
,它将Int x和函数p作为参数,并返回布尔结果p(x)。很简单。
def masterChecker(x: Int, p: Int => Boolean): Boolean = p(x)
然后我有第二个函数childChecker
,就像masterChecker
的别名
def childChecker(x: Int, f: Int => Boolean): Boolean = masterChecker(x , f)
是否有办法更改f
masterCheker
来自childChecker
的{{1}},其运行方式与!f
相同? (如果f返回true,则将其设为false)
像:
// inside childChecker
masterChecker(x, !f)
我知道我可以在使用!masterChecker(x,f)
的masterChecker调用中执行此操作,但我想知道的是,是否可以更改作为参数传递的函数行为。
答案 0 :(得分:4)
当然,你可以使用这样的匿名函数:
def childChecker(x: Int, f: Int => Boolean) = masterCheck(x, !f(_))
然后你去!
更重要的是,如果你想要修改"你可以做很多事情。 f
的函数范围内的childChecker
:
def childChecker(x: Int, f: Int => Boolean) ={
def proxy(x: Int): Boolean ={
val y: Int = //do things
f(y) //see? "y" not "x"
}
masterCheck(x, proxy)
}
当你处理普通的'时,这是乐趣的一部分。功能。当然,这个"修改"更像是装饰器模式,但它确实遵循界面。