我是scala的新手,想知道下面的语法意味着什么?
def exec[T](f: () => T): T = { f() }
据我所知,函数"exec"期望函数作为参数并返回"T"类型的值,但那么 exec[T] 表示什么?
exec 是方法名称,其中 T 是方法的泛型类型参数 .
exec
T
方法签名需要指定类型 T ,以便我们能够指定 T 作为方法的参数 .
使用泛型类型参数时,您可以传递不同的类型并在它们之间重用相同的代码,例如:
scala> exec[Int](() => 1) res29: Int = 1 scala> exec[Double](() => 1.0) res30: Double = 1.0 scala> exec[String](() => "hello, world") res31: String = hello, world
当我声明 exec[Int] 时,参数 f 现在是 Function0[Int]] (如果我们使用语法糖,则为 () => Int )
exec[Int]
f
Function0[Int]]
() => Int
正如@TzachZohar所指出的那样,Scala编译器足够聪明,有时能够为我们推断出类型参数,这意味着我们可以在使用该方法时省略方括号 . 例如:
scala> exec(() => 1) res32: Int = 1 scala> exec(() => 1.0) res33: Double = 1.0 scala> exec(() => "hello, world") res34: String = hello, world
这适用于编译器能够通过方法返回类型推断 T 的类型 .
您可以阅读有关这些主题的更多信息:Type & polymorphism basics,Generic Classes,Local Type Inference和Scala Specification for Local Type Inference
1 回答
exec
是方法名称,其中T
是方法的泛型类型参数 .方法签名需要指定类型
T
,以便我们能够指定T
作为方法的参数 .使用泛型类型参数时,您可以传递不同的类型并在它们之间重用相同的代码,例如:
当我声明
exec[Int]
时,参数f
现在是Function0[Int]]
(如果我们使用语法糖,则为() => Int
)正如@TzachZohar所指出的那样,Scala编译器足够聪明,有时能够为我们推断出类型参数,这意味着我们可以在使用该方法时省略方括号 . 例如:
这适用于编译器能够通过方法返回类型推断
T
的类型 .您可以阅读有关这些主题的更多信息:Type & polymorphism basics,Generic Classes,Local Type Inference和Scala Specification for Local Type Inference