让函数参与入参与出参

来源:互联网 发布:淘宝店铺如何注销关闭 编辑:程序博客网 时间:2024/04/29 18:21

1.这个语法并不是难点,毕竟C++就可以用指针实现了,所以语法并不是我们的见解部分,我们是要知道该函数的作用!

 

2.实现入参是个函数,能提供什么,出参又能干什么,这好比把两个水管对接,而该函数正是该桥梁,既然是桥梁,那么我们就做桥梁的事情吧

 

@1.桥梁可以充当简单的拼接剪切路或加减路长度的功能

 

我们来拼接路

 

 

定义函数FN

1.他接受一个函数,放回另一个函数,所以我们把它type成一种数据("这里只是别名")

 type Func[A,B,C] = (A => B) => (B => C)


fn函数

scala> def func1(fc:Func[Int,String,String]){     | val c = fc(_ + " one\n")(" two")     | println(c)     | }

 

接着我们定义Func类型的参数

scala> val fn = (f1:Int=>String) => f1(1) + "2" + _fn: (Int => String) => (Any => String) = <function1>


我们测试一下

scala> func1(fn)1 one2 two


 

2.其实这里看不出蹊跷的地方

 

我们来设计一个校验权限的简单框架

 

功能

1.根据所给的名字(可以从数据库获取),来判断用户是否有对应的权限

2.由于后期维护,多人用户拥有对应的权限

 

这时用该高级函数就容易维护系统了

 

 

1.同样定义别名

 

scala>  type Func[A,B,C] = (A => B) => (B => C)defined type alias Func


2.定义权限检查

val fn1 = (f1:String=>String) => f1("Auth:2015.10").endsWith(_)


3.定义fn

scala> def func1(fc:Func[String,String,Boolean]){     | val res = fc(_ + " name0")("0")     | res match {     |  case true => println("name0 has Auth!")     |  case _ => println("name0 has no Auth!")     | }     | }

4.测试

scala> func1(fn1)name0 has Auth!


对于2步骤我们可以利用保存log

scala>  val fn1 = (f1:String=>String) => {val log = f1("Auth:2015.10");println(log);log.endsWith(_)}fn1: (String => String) => (String => Boolean) = <function1>scala> func1(fn1)Auth:2015.10 name0name0 has Auth!scala>


这样我们就保存了log

 

几个月后突然老板说要加上一种验证方式,这时我们完全可以

scala>  def func1(fc:Func[String,String,Boolean]){     | val res = fc(_ + " name0")("0")     | val res1 = fc(_ + " name0")("1")     | res match {     | case true => println("name0 has Auth  _1!")     |  case _ => println("name0 has no Auth _1!")     | }     |  res1 match {     |  case true => println("name0 has Auth  _2!")     |  case _ => println("name0 has no Auth _2!")     | }     | }func1: (fc: Func[String,String,Boolean])Unitscala> func1(fn1)Auth:2015.10 name0Auth:2015.10 name0name0 has Auth  _1!name0 has no Auth _2!scala>


或者如果只是一个用户多个权限验证的话

scala>  def func1(fc:Func[String,String,Boolean]){     | val res = fc(_ + " name0")("0") && fc(_ + " name0")("1")     |     | res match {     |  case true => println("name0 has Auth!")     |  case _ => println("name0 has no Auth!")     | }     | }func1: (fc: Func[String,String,Boolean])Unitscala> func1(fn1)Auth:2015.10 name0Auth:2015.10 name0name0 has no Auth!

这里我们用高级函数,让普通函数具备输入函数和输出函数的功能,主要目的是耦合目的是耦合度

 


 

 

 

 

 


 


 

 

 

 

0 0