gpt4 book ai didi

scala - Scala 中的隐式函数。这是如何工作的?

转载 作者:行者123 更新时间:2023-12-04 02:59:29 24 4
gpt4 key购买 nike

我正在学习 Scala 中的教程,我看到了这个:

object implicitFunctions extends App {
println("Step 1: How to create a wrapper String class which will extend the String type")
class DonutString(s: String) {
def isFavoriteDonut: Boolean = s == "Glazed Donut"
}

println("\nStep 2: How to create an implicit function to convert a String to the wrapper String class")
object DonutConversions {
implicit def stringToDonutString(s: String) = new DonutString(s)
}

println("\nStep 3: How to import the String conversion so that it is in scope")
import DonutConversions._

println("\nStep 4: How to create String values")
val glazedDonut = "Glazed Donut"
val vanillaDonut = "Vanilla Donut"

println("\nStep 5: How to access the custom String function called isFavaoriteDonut")
println(s"Is Glazed Donut my favorite Donut = ${glazedDonut.isFavoriteDonut}")
println(s"Is Vanilla Donut my favorite Donut = ${vanillaDonut.isFavoriteDonut}")
}

到底发生了什么?我猜想在 String 类上找不到任何方法,所以我们查看导入的隐式并通过调用 stringToDonutStringString 进行转换,方法是调用函数并传入缺失方法的接收者(字符串)。是吗?

为什么隐式必须包装在对象中?

最佳答案

 ${glazedDonut.isFavoriteDonut}"

当调用上面的代码时,编译器会在 String 中搜索 isFavoriteDonut 方法(因为 glazedDonut 是 String 类型)。当然,它没有找到它。

因此,编译器然后搜索隐式,它可以将 String 转换为其他类型(我们称之为 Unknown),这样 Unknown 类型包含 isFavoriteDonut 方法。

并且它在作用域中找到这样一个隐式函数,它可以转换 String => DonutString 并且它知道 DonutString 包含 glazedDonut

Why does the implicit have to be wrapped in an object?

规范不允许创建顶级隐式 类和函数。 https://scala-lang.org/files/archive/spec/2.12/07-implicits.html

The implicit modifier is illegal for all type members, as well as for top-level objects.

关于scala - Scala 中的隐式函数。这是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50593346/

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