gpt4 book ai didi

scala - 理解 Scala 中的隐式

转载 作者:行者123 更新时间:2023-12-03 04:01:14 27 4
gpt4 key购买 nike

我在学习 Scala playframework 教程时遇到了这段令我困惑的代码片段:

def newTask = Action { implicit request =>
taskForm.bindFromRequest.fold(
errors => BadRequest(views.html.index(Task.all(), errors)),
label => {
Task.create(label)
Redirect(routes.Application.tasks())
}
)
}

所以我决定调查一下并发现了this post .

我还是没明白。

这有什么区别:

implicit def double2Int(d : Double) : Int = d.toInt

def double2IntNonImplicit(d : Double) : Int = d.toInt

除了明显的事实之外,它们具有不同的方法名称。

什么时候应该使用隐式以及为什么?

最佳答案

我将在下面解释隐式的主要用例,但有关更多详细信息,请参阅 relevant chapter of Programming in Scala .

隐式参数

方法的最终参数列表可以标记为 implicit ,这意味着这些值将从调用它们的上下文中获取。如果作用域中没有正确类型的隐式值,则它将无法编译。由于隐式值必须解析为单个值并避免冲突,因此最好使类型特定于其用途,例如不需要您的方法来查找隐式 Int !

示例:

  // probably in a library
class Prefixer(val prefix: String)
def addPrefix(s: String)(implicit p: Prefixer) = p.prefix + s

// then probably in your application
implicit val myImplicitPrefixer = new Prefixer("***")
addPrefix("abc") // returns "***abc"

隐式转换

当编译器发现上下文类型错误的表达式时,它将查找隐式 Function允许进行类型检查的类型的值。所以如果 A是必需的,它找到 B ,它将查找 B => A 类型的隐式值在范围内(它还会检查其他一些地方,例如 BA 伴生对象(如果存在))。自 def s 可以“eta 扩展”为 Function对象,一个implicit def xyz(arg: B): A也会这样做。

所以你的方法之间的区别在于标记为 implicit 的方法当 Double 时,编译器会为您插入找到了一个 Int是必须的。

implicit def doubleToInt(d: Double) = d.toInt
val x: Int = 42.0

工作方式与

相同
def doubleToInt(d: Double) = d.toInt
val x: Int = doubleToInt(42.0)

在第二个例子中,我们手动插入了转换;在第一个中,编译器自动执行相同的操作。由于左侧有类型注释,所以需要进行转换。

<小时/>

关于 Play 中的第一个片段:

操作在 this page 上进行了解释来自 Play 文档(另请参阅 API docs )。您正在使用

apply(block: (Request[AnyContent]) ⇒ Result): Action[AnyContent]

关于Action对象(它是同名特征的同伴)。

所以我们需要提供一个函数作为参数,它可以写成以下形式的文字

request => ...

在函数文字中,=> 之前的部分是一个值声明,可以标记为 implicit如果你愿意,就像任何其他val一样声明。在这里,request 不必必须标记为 implicit为此进行类型检查,但通过这样做,它将可以作为函数中可能需要它的任何方法的隐式值使用(当然,它也可以显式使用)。在这种特殊情况下,这样做是因为 bindFromRequest Form 上的方法类需要隐式 Request论证。

关于scala - 理解 Scala 中的隐式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10375633/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com