考虑以下代码:
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时。但我无法理解:
Sample{"World"}
?它的名称是什么以及它如何调用apply()
?body: => String
中的apply()
是什么意思?如果body:
和=>
之间没有空格,为什么会给我一个错误?java.lang.String
作为退货而不只是String
?答案 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
参数的说明。在这里,body
是call by name
参数。这些参数的语法必须在: and =>
之间放置一个空格。有关详细信息,请参阅call by name Vs call be value
为什么要求我输入java.lang.String作为return而不是String?
=>首先,您需要明确scala中的String
是java.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
它会以同样的方式运作。