apply()如何处理特征的伴随对象?

时间:2017-02-05 08:33:55

标签: scala

考虑以下代码:

object Rough extends App {
  trait Sample

  object Sample {
    def apply[String](body: => String): java.lang.String = {
      "Hello " + body
    }
  }

  val s: String = Sample {
    "World"
  }
  print(s)
}

在代码中,当我能够理解正在调用apply时。但我无法理解:

  1. 这种语法是什么意思:Sample{"World"}?它的名称是什么以及它如何调用apply()
  2. body: => String中的apply()是什么意思?如果body:=>之间没有空格,为什么会给我一个错误?
  3. 为什么要求我输入java.lang.String作为退货而不只是String

1 个答案:

答案 0 :(得分:4)

这种语法是什么意思:示例{“World”}?它叫做什么以及如何调用apply()?

=>它是syntactic sugar,Scala编译器将Sample("World")Sample{"World"}转换为Sample.apply("World")。例如:当你创建一个列表时

val list  = List(1,2,3) 

编译器实际上将其转换为List.apply(1,2,3)

body:=> apply()中的字符串是什么意思?如果body:和=>?

之间没有空格,为什么会给我一个错误

=>它是scala中call by name参数的说明。在这里,bodycall by name参数。这些参数的语法必须在: and =>之间放置一个空格。有关详细信息,请参阅call by name Vs call be value

为什么要求我输入java.lang.String作为return而不是String?

=>首先,您需要明确scala中的Stringjava.lang.String的别名。如果您在scala.Predef内看到,您会发现:

type String = java.lang.String

因此,我们实际上一直在scala中使用相同的java.lang.String

其次,在您的申请方法中:

def apply[String](body: => String)

apply[String]未使用scala String,而是使用type parameter。我的意思是你也可以将你的申请方法写成:

def apply[T](body: => T):java.lang.String 

它会以同样的方式运作。