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