gpt4 book ai didi

scala - 为什么我可以在 Scala 中连接 String 和 Int?

转载 作者:行者123 更新时间:2023-12-02 08:13:18 25 4
gpt4 key购买 nike

我正在 Scala 中尝试一些来自 Python 的东西。由于 Scala 在保持类型一致方面更加严格,我惊讶地发现我可以执行以下连接,这在 Python 中会崩溃:

def adder(one:Any, two:String) = {one+two}

adder("word", "suffix")

res13: String = wordsuffix

还有:

val x:Int = 1

adder(x, "suffix")

res12: String = 1suffix

  • 所以它只是将一个 Int 转换为一个 String 而不告诉我。这叫什么,背后的逻辑是什么?

  • 这样做有什么好处?我觉得它会回来咬我,例如在处理用户对函数的输入时。

我知道这不是很具体,如果这太宽泛,我很乐意收回这个问题。

最佳答案

scala.Predef 中有一个隐式类,可以对任何类型的对象进行操作

  implicit final class any2stringadd[A](private val self: A) extends AnyVal {
def +(other: String): String = String.valueOf(self) + other
}

实现 Any + String(正如您在 adder 中定义的那样)。正如 rogue-one 所提到的,还有一种连接 String + Any defined in StringOps 的方法.如果您尝试执行 Any + Any 它将失败,因为它需要一个 String 作为参数。

So it just transforms an Int into a String w/out telling me

Scala 正在将您的 Int 转换为 String,但这不是类型转换,因为 Int 不能被强制转换为 String 。你可以通过尝试这样的方式来观察:

def foo(str: String) = ???
foo(5) // Type mismatch: expected: String, actual: Int

这将无法编译,因为 Scala 不能神奇地将 Int 强制转换为 String

what is the logic behind it?

implicit classes

And what is the benefit of this? I feel it can come back to bite me, e.g. when dealing with user input to a function.

这是一种非常特定于 String 和连接的便捷方法。这个特性是用 Java 实现的,所以我相信它是用 Scala 实现的,以保持源代码兼容性。我上面的例子表明(除了在这种特定情况下),用户对函数的输入将尊重函数上定义的类型。

关于scala - 为什么我可以在 Scala 中连接 String 和 Int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44147154/

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