加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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,其中我们不使用隐式定义,但它存在,因为匿名函数传递带隐式.

编辑:
为了以防万一,我发布了另一个例子 – 简单模拟Play’Action的工作原理:

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.但是,没有办法从声明中神奇地改变从隐式范围获取值的乐趣.

我希望你现在能够更好地理解隐含的内容,起初它们可能有点棘手.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读