关于使用scala def apply方法

时间:2016-10-19 14:19:10

标签: scala

val B = new {
  def apply : { val a : Int } => { val b : String ; val c : Int } =
    x => new { val b = "Hi" ; val c = 0 }
}

我无法理解这段代码 它在做什么?
我如何使用B的应用。似乎B没有b或c ..

1 个答案:

答案 0 :(得分:1)

在这里编译得很好。

scala> val B = new {
    |   def apply : { val a : Int } => { val b : String ; val c : Int } =
    |     x => new { val b = "Hi" ; val c = 0 }
    | }
B: AnyRef{def apply: AnyRef{val a: Int} => AnyRef{val b: String; val c: Int}} = $anon$1@464bee09

签名很清楚,但是你必须习惯这个。

AnyRef

一个匿名对象。与java Object相似

  {def apply: AnyRef{val a: Int} => AnyRef{val b: String; val c: Int}}

但是,您仍然可以通过结构类型获得签名。一世 通常不会建议,它在运行时使用反射,这使得 方法调用有点慢。

  def apply: AnyRef{val a: Int} => AnyRef{val b: String; val c: Int}

它返回=>,也称为Function1,它是函数的缩写 带有一个参数的对象。这里采用类型为AnyRef{val a: Int}的参数,并返回类型为AnyRef{val b: String; val c: Int}的对象。

与上述相同的评论适用于结构类型性质。

我建议如何编写此代码:

case class Foo(b: String, c: Int)
val B: Int => Foo = { x => Foo("Hi", 0) }