gpt4 book ai didi

scala - 了解 Scala 中的 Some 和 Option

转载 作者:行者123 更新时间:2023-12-03 03:53:25 26 4
gpt4 key购买 nike

我正在从他们的 docs 中阅读这个示例:

class Email(val username: String, val domainName: String)

object Email {
def fromString(emailString: String): Option[Email] = {
emailString.split('@') match {
case Array(a, b) => Some(new Email(a, b))
case _ => None
}
}
}

println(Email.fromString("scala.center@epfl.ch"))
val scalaCenterEmail = Email.fromString("scala.center@epfl.ch")
scalaCenterEmail match {
case Some(email) => println(
s"""Registered an email
|Username: ${email.username}
|Domain name: ${email.domainName}
""")
case None => println("Error: could not parse email")
}

我的问题:

  1. 什么是SomeOption

  2. 什么是工厂方法(只是一些创建新对象并返回它的函数?)

  3. 伴生对象的意义是什么?它只是包含可用于类的所有实例的函数吗?它们像 Ruby 中的类方法吗?

最佳答案

What is Some and Option?

Option 顾名思义,是一种表示可选性的数据结构。每当计算无法返回值时,您都可以返回OptionOption 有两种情况(表示为两个子类):SomeNone

在上面的示例中,方法 Email.fromString 可能会失败并且不返回值。这用 Option 表示。为了知道计算是否产生了一个值,您可以使用 match 并检查它是 Some 还是 None:

Email.fromString("scala.center@epfl.ch") match {
case Some(email) => // do something if it's a Some
case None => // do something it it's a None
}

这比返回 null 好得多,因为现在无论谁调用该方法都不可能忘记检查返回值。

例如比较一下:

def willReturnNull(s: String): String = null

willReturnNull("foo").length() // NullPointerException!

有了这个

def willReturnNone(s: String): Option[String] = None

willReturnNone("foo").length() // doesn't compile, because 'length' is not a member of `Option`

另请注意,使用 match 只是使用 Option 的一种方式。进一步的讨论将涉及使用 mapflatMapgetOrElseOption 上定义的类似方法,但我觉得它会这里离题了。

What is a factory method (just some function that creates a new object and returns it?)

这并不是 Scala 特有的。 “工厂方法”通常是构造某种类型的值的静态方法,可能隐藏类型本身的详细信息。在本例中,fromString 是一个工厂方法,因为它允许您创建一个 Email,而无需使用 new Email(.. .)

What is the point of companion objects? Is it just to contain functions that are available to all instances of class? Are they like class methods in Ruby?

初步估计,是的。 Scala 没有类的静态成员。相反,您可以拥有一个与该类关联的对象,您可以在其中定义所有静态内容。

例如在 Java 中你会:

public class Email {
public String username;
public String domain;
public static Optional<Email> fromString(String: s) {
// ...
}
}

与 Scala 中一样,您可以大致定义相同的类:

class Email(val username: String, val domain: String)
object Email {
def fromString(s: String): Option[Email] = {
// ...
}
}

关于scala - 了解 Scala 中的 Some 和 Option,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49944872/

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