Scala通过将函数作为参数传递隐式参数来感受adnvatage
发布时间:2020-12-16 18:12:20 所属栏目:安全 来源:网络整理
导读:我试着感受 Scala中隐式参数的优势. (已编辑:使用匿名函数时的特殊情况.请查看此问题中的链接) 我尝试基于this帖子进行简单的模拟.在哪里解释了Action在PlayFramework中的工作原理.这也与that有关. 以下代码用于此目的: object ImplicitArguments extends
我试着感受
Scala中隐式参数的优势. (已编辑:使用匿名函数时的特殊情况.请查看此问题中的链接)
我尝试基于this帖子进行简单的模拟.在哪里解释了Action在PlayFramework中的工作原理.这也与that有关. 以下代码用于此目的: object ImplicitArguments extends App { implicit val intValue = 1 // this is exiting value to be passed implicitly to everyone who might use it def fun(block: Int=>String): String = { // we do not use _implicit_ here ! block(2) // ?? how to avoid passing '2' but make use of that would be passed implicitly ? } // here we use _implicit_ keyword to make it know that the value should be passed ! val result = fun{ implicit intValue => { // this is my 'block' intValue.toString // (which is anonymous function) } } println(result) // prints 2 } 我想打印“1”. 如何避免传递魔法“2”但使用隐含定义的“1”? 另请参阅case,其中我们不使用隐式定义,但它存在,因为匿名函数传递带隐式. 编辑: object ImplicitArguments extends App { case class Request(msg:String) implicit val request = Request("my request") case class Result(msg:String) case class Action(result:Result) object Action { def apply(block:Request => Result):Action = { val result = block(...) // what should be here ?? new Action(result) } } val action = Action { implicit request => Result("Got request [" + request + "]") } println(action) } 解决方法
Implicits不能像这样工作.没有魔力.它们只是(通常)隐藏的参数,因此在调用函数时会被解析.
有两种方法可以使您的代码工作. 你可以修复所有有趣的调用的隐含值 def fun(block: Int=>String): String = { block(implicitly[Int]) } 隐式是Predef中定义的函数.再一次没有魔力.这是它的定义 def implicitly[A](implicit value: A) = value 但这意味着它将在声明乐趣而不是每次调用时解析隐含值. 如果要为不同的调用使用不同的值,则需要添加隐式参数 def fun(block: Int=>String)(implicit value: Int): String = { block(value) } 现在,这将取决于呼叫站点的隐式范围.你可以像这样轻松覆盖它 val result = fun{ _.toString }(3) 并且结果将是“3”,因为最后显式3.但是,没有办法从声明中神奇地改变从隐式范围获取值的乐趣. 我希望你现在能够更好地理解隐含的内容,起初它们可能有点棘手. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |