Scala为类

时间:2016-11-24 16:07:01

标签: scala functional-programming

我在检查Scala代码时遇到了以下代码。我发现很难理解它的作用。

class Foo(val name: String, val age: Int, val sex: Symbol)

object Foo {
  def apply(name: String, age: Int, sex: Symbol) = new Foo(name, age, sex)
}

它是否为已经定义的Class Foo添加了构造函数方法?

是否可以为使用此语法定义的类添加额外的方法?

5 个答案:

答案 0 :(得分:3)

  

它是否已经为类Foo添加了构造函数方法   定义

它为类增加了语法糖。这意味着,您可以像这样创建Foo的实例:

val foo = Foo()

而不是

val foo = new Foo()
  

是否可以向已经添加的类添加额外的方法   使用这种语法定义?

在这方面,apply是特殊的,因为编译器知道它并将Foo()扩展为Foo.apply。这意味着您要调用的任何其他方法,您必须调用Foo静态对象,但它们不适用于Foo 实例

如果要在Foo外部添加方法,可以通过隐式类来实现:

implicit class RichFoo(foo: Foo) extends AnyVal {
  def fooDetails(): String = s"{Name: ${foo.name}, Age: ${foo.Age}"
}

现在,您可以在 Foo 的实例上调用它:

val f = Foo()
println(f.fooDetails())

答案 1 :(得分:2)

请阅读有关伴侣对象的信息:http://docs.scala-lang.org/tutorials/tour/singleton-objects.html希望这会有所帮助 它简化了此类型的对象创建。其他方法是创建案例类。

看起来像我一样重复: Scala: companion object purpose

答案 2 :(得分:2)

在这种情况下,您可以将Foo.apply()视为静态方法。

实际上,Scala中的对象是作为Singleton实例实现的。

Here's the documentation on that.

答案 3 :(得分:2)

如果Scala具有apply方法,则可以在Scala中调用任何类或对象实例。你在这里做的是向Foo的伴随对象添加构造函数方法,这样当你调用它时,它将实例化Foo.的实例

使用此方法无法向实例添加方法。为此,您可能对使用implicits实现的Scala Pimp My Library模式感兴趣。

// the following are equivalent, given your code above

val x = new Foo("Jason", 29, 'Male)
val y = Foo.apply("Jason", 29, 'Male)
val z = Foo("Jason", 29, 'Male)

答案 4 :(得分:1)

此模式通常称为static factory methods。您提供的代码不是很有用,但请考虑这些额外的工厂方法(将它们视为“命名构造函数”):

class Foo(val name: String, val age: Int, val sex: Symbol)

object Foo {
  def apply(name: String, age: Int, sex: Symbol) = new Foo(name, age, sex)
  def newMaleFoo(name:String,age:int) = new Foo(name,age,'male)
  def newPeterFoo(age:int) = new Foo("Peter",age,'male)
}