我在检查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添加了构造函数方法?
是否可以为使用此语法定义的类添加额外的方法?
答案 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)
答案 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)
}