Scala:为什么在函数参数上使用隐式?
我有以下功能:
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找出哪个隐式函数提供了值. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |