修改作为参数传递的函数

时间:2014-05-14 19:50:18

标签: scala

我有两个功能。一个是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调用中执行此操作,但我想知道的是,是否可以更改作为参数传递的函数行为。

1 个答案:

答案 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)
 }
当你处理普通的'时,这是乐趣的一部分。功能。当然,这个"修改"更像是装饰器模式,但它确实遵循界面。