gpt4 book ai didi

scala - 为什么 scala 允许使用 Option[Strings](或任何其他类型)连接字符串?

转载 作者:行者123 更新时间:2023-12-04 00:00:13 33 4
gpt4 key购买 nike

在 scala 中编码时,我错误地将字符串与 Option[String] 连接起来。我希望作为一种强类型语言,scala不允许我做这样的操作。
这是我尝试过的。
这行得通

scala> val a:String = "aaa"
val a: String = aaa

scala> val b:Option[String] = Some("bbbb")
val b: Option[String] = Some(bbbb)

scala> a + b
val res0: String = aaaSome(bbbb)

scala> val c:Option[String] = None
val c: Option[String] = None

scala> val d = a + c
val d: String = aaaNone

scala> val e = 1
val e: Int = 1

scala> a + e
val res2: String = aaa1

虽然这不起作用

scala> val f:Option[String] = Some("ffff")
val f: Option[String] = Some(ffff)

scala> val g:Option[String] = None
val g: Option[String] = None

scala> f + g
^
error: type mismatch;
found : Option[String]
required: String

为什么 scala 允许这种行为?像 python 这样的动态类型语言会阻止我将字符串添加到 int 类型、None 类型或字符串以外的任何类型。好奇这种设计是不是故意的?如果有,为什么?

最佳答案

Scala 在它的 Predef 包中包含一个隐式类 any2stringadd。这个类负责这些连接操作。

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

这意味着,默认情况下,范围包含一个方法+,它可以通过将这种类型的值转换为字符串来连接任何类型的值A String.valueOf(...).

我不能谈论设计选择,我同意这可能是一种意外行为。这同样适用于 Scala 的原生 == 方法。例如,这段代码编译得很好:Some("a") == "b"。这可能会导致过滤和其他方法中出现严重的错误。

如果你想消除这种行为,我建议你看看 https://typelevel.org/cats/库,它引入了可以解决这个问题的不同类型类。

例如,对于字符串连接,您可以使用 Semigroup 类型类(它也有大量其他有用的用例):

import cats.Semigroup

Semigroup[String].combine("a", "b") // works, returns "ab"
Semigroup[String].combine("a", Some("b")) // won't work, compilation error

这看起来很乏味,但是有一个语法糖:

import cats.implicits._
"a" |+| "b" // works, returns "ab"
"a" |+| Some("b") // won't work, compilation error
// |+| here is the same as Semigroup[String].combine

同样的事情也适用于 == 方法。相反,您可以使用 Eq 类型类:

import cats.implicits._
"a" == Some("b") // works, no error, but could be unexpected
"a" === Some("b") // compilation error (Cats Eq)
"a" === "b" // works, as expected
"a" =!= "b" // same as != but type safe

关于scala - 为什么 scala 允许使用 Option[Strings](或任何其他类型)连接字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62792005/

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