了解Scala中的一些特性和选项

了解Scala中的一些特性和选项,scala,Scala,我从他们的网站上读到了这个例子: 我的问题是: 什么是部分和选项 什么是工厂方法(只是一些创建新对象并返回它的函数?) 伴生物体的意义是什么?它只是包含可用于类的所有实例的函数吗?它们像Ruby中的类方法吗 什么是一些选择 Option顾名思义,是一种表示可选性的数据结构。每当计算可能不返回值时,您可以返回一个选项选项有两种情况(表示为两个子类):部分或无 在上面的示例中,Email.fromString方法可能会失败,并且不会返回值。这用选项表示。为了知道计算是否产生了值,您可以使用match

我从他们的网站上读到了这个例子:

我的问题是:

  • 什么是
    部分
    选项

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

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

  • 什么是一些选择

    Option
    顾名思义,是一种表示可选性的数据结构。每当计算可能不返回值时,您可以返回一个
    选项
    <代码>选项有两种情况(表示为两个子类):
    部分

    在上面的示例中,
    Email.fromString
    方法可能会失败,并且不会返回值。这用
    选项
    表示。为了知道计算是否产生了值,您可以使用
    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
    只是使用
    选项的一种方式。进一步的讨论将涉及使用
    map
    flatMap
    getOrElse
    选项
    上定义的类似方法,但我觉得这将脱离主题

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

    这不是Scala特有的。“工厂方法”通常是一种静态方法,它构造某种类型的值,可能隐藏类型本身的细节。在这种情况下,
    fromString
    是一种工厂方法,因为它允许您使用
    新电子邮件(…)

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

    作为第一近似值,是的。Scala没有类的静态成员。相反,您可以让一个
    对象
    与该类关联,在该类中定义所有静态的内容

    例如,在Java中,您将拥有:

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

    我想在第三个问题上加上一些例子/资料

    如果您在companion对象中使用
    akka
    ,您可以将您在case方法中使用的每一条消息放入(它应该继续并由参与者使用)。此外,还可以为参与者名称或其他常量值添加一些val

    如果您使用JSON,您应该为它创建一种格式(有时是自定义读写)。这种格式应该放在伴生对象中。方法来创建实例

    如果深入到Scala,您可以找到
    案例类
    。因此,不使用
    new
    创建此类对象的可能性是因为在“default”
    companion object
    中应用了一种方法

    但一般来说,它是一个可以放置所有“静态”方法的地方

    关于
    选项
    ,它为您提供了一种可能性,可以避免一些异常,并在您没有任何值时生成一些内容。 Gabriele举了一个电子邮件的例子,所以我将添加另一个。 您有一个发送电子邮件的方法,但您从
    User
    类接收电子邮件。用户可以让这个字段为空,所以如果我们有类似的内容
    val-maybeEmail:Option[String]=user.email
    您可以使用示例map发送电子邮件
    maybeEmail.map(email=>sendmail(email))


    所以,如果您使用它,在编写上述方法时,您不需要认为用户是否指定了他的电子邮件:)

    工厂是一种设计模式,并不特定于Scala。关于剩下的问题,有一些关于scala的好书和教程,只需搜索:选项是一个,在函数编程中,函数的设计目的是不将函数分解为错误,而是安全/一致地返回相同类型的数据,以便您以后可以处理它,更多信息。就像在Int中一样,您可以返回值…-2323…,1,2,3。。。在选项中,如果成功,您可以返回一些,如果失败,则无返回。如果您有多个问题,请提出多个问题。特别是,我们的三个问题中的每一个都已经被问过并回答过多次了,但是使用内置的重复系统是不可能指出这些问题的,因为您的问题会将它们合并成一个问题。的一个重要特性是,可以通过多个不同的问题访问知识,但您的问题打破了这一系统。您不应该阅读一篇好的介绍/教程,而不是阅读您不理解的文档,并运行到任何Scala初学者都可以回答的问题?
    public class Email {
       public String username;
       public String domain;
       public static Optional<Email> fromString(String: s) {
          // ...
       }
    }
    
    class Email(val username: String, val domain: String)
    object Email {
      def fromString(s: String): Option[Email] = {
        // ...
      }
    }