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

Scala:为什么在函数参数上使用隐式?

发布时间:2020-12-16 08:50:27 所属栏目:安全 来源:网络整理
导读:我有以下功能: def getIntValue(x: Int)(implicit y: Int ) : Int = {x + y} 我到处都看到上面的声明.我理解上面的功能在做什么.这是一个currying函数,它有两个参数.如果省略第二个参数,它将调用返回int的隐式定义.所以我认为它与定义参数的默认值非常相似.
我有以下功能:

def getIntValue(x: Int)(implicit y: Int ) : Int = {x + y}

我到处都看到上面的声明.我理解上面的功能在做什么.这是一个currying函数,它有两个参数.如果省略第二个参数,它将调用返回int的隐式定义.所以我认为它与定义参数的默认值非常相似.

implicit val temp = 3

scala> getIntValue(3)
res8: Int = 6

我想知道上述声明有什么好处?

解决方法

这是我的“务实”答案:你通常使用currying作为更多的“约定”而不是其他任何有意义的东西.当您的上一个参数恰好是“按名称调用”参数时(例如::=>布尔值),它非常方便:

def transaction(conn: Connection)(codeToExecuteInTransaction : => Boolean) = {

   conn.startTransaction  // start transaction

   val booleanResult = codeToExecuteInTransaction //invoke the code block they passed in

  //deal with errors and rollback if necessary,or commit
  //return connection to connection pool
}

这说的是“我有一个叫做事务的函数,它的第一个参数是一个连接,它的第二个参数是一个代码块”.

这允许我们像这样使用这个方法(使用“我可以使用大括号而不是括号规则”):

transaction(myConn) {

   //code to execute in a transaction
  //the code block's last executable statement must be a Boolean as per the second
  //parameter of the transaction method

}

如果你没有讨论那种交易方法,那么看起来很不自然:

transaction(myConn,{

   //code block

})

隐含的怎么样?是的,它看起来像一个非常模糊的构造,但是你会在一段时间后习惯它,而隐式函数的优点是它们具有范围规则.所以这意味着生产,你可以定义一个隐式函数来从PROD数据库获取数据库连接,但在集成测试中你将定义一个隐式函数,它将取代PROD版本,它将用于获取连接来自DEV数据库,而不是用于您的测试.

作为一个例子,我们如何在事务方法中添加隐式参数?

def transaction(implicit conn: Connection)(codeToExecuteInTransaction : => Boolean) = {

}

现在,假设我的代码库中有一个隐式函数返回一个Connection,如下所示:

def implicit getConnectionFromPool() : Connection = { ...}

我可以像这样执行事务方法:

transaction {
   //code to execute in transaction
}

而Scala会将其翻译为:

transaction(getConnectionFromPool) {
  //code to execute in transaction
}

总之,Implicits是一种非常好的方法,当该参数在所有使用该函数的地方99%的时间都相同时,不必让开发人员为所需参数提供值.在1%的时间内,您需要一个不同的Connection,您可以通过传入一个值来提供自己的连接,而不是让Scala找出哪个隐式函数提供了值.

(编辑:李大同)

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

    推荐文章
      热点阅读