Scala apply()如何处理trait的同伴对象?

Scala apply()如何处理trait的同伴对象?,scala,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时。但我无法理

考虑以下代码:

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()
  • apply()
    中的
    body:=>String
    是什么意思?如果
    正文:
    =>
    之间没有空格,为什么会给我一个错误
  • 为什么它要求我键入
    java.lang.String
    作为返回,而不仅仅是
    String

  • 这个语法是什么意思:示例{“世界”}?它被称为什么以及如何调用apply()?

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

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

    apply()中的body:=>字符串是什么意思?如果body:and=>之间没有空格,为什么会出现错误?

    =>这是scala中
    callbyname
    参数的一个示例。这里,
    body
    callbyname
    参数。这些参数的语法必须在
    :和=>
    之间留出一个空格。有关更多信息,请参见

    为什么它要求我键入java.lang.String作为返回,而不仅仅是字符串?

    =>首先,您需要清楚scala中的
    字符串是
    java.lang.String
    的别名。如果您在
    scala.Predef
    中看到,您会发现:

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

    其次,在应用方法中:

    def apply[String](body: => String)
    
    apply[String]
    没有使用
    scala字符串
    ,而是使用了
    类型参数
    。我的意思是,您也可以将应用方法写为:

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

    它也会以同样的方式工作。

    这个语法是什么意思:Sample{“World”}?它被称为什么以及如何调用apply()?

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

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

    apply()中的body:=>字符串是什么意思?如果body:and=>之间没有空格,为什么会出现错误?

    =>这是scala中
    callbyname
    参数的一个示例。这里,
    body
    callbyname
    参数。这些参数的语法必须在
    :和=>
    之间留出一个空格。有关更多信息,请参见

    为什么它要求我键入java.lang.String作为返回,而不仅仅是字符串?

    =>首先,您需要清楚scala中的
    字符串是
    java.lang.String
    的别名。如果您在
    scala.Predef
    中看到,您会发现:

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

    其次,在应用方法中:

    def apply[String](body: => String)
    
    apply[String]
    没有使用
    scala字符串
    ,而是使用了
    类型参数
    。我的意思是,您也可以将应用方法写为:

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

    它也会以同样的方式工作。

    非常感谢您为我的问题提供了准确而简洁的答案!非常感谢您对我的问题给出了准确而简洁的答案!