2016-09-27 9 views
1

私は現在のチュートリアルを使用してスカラを学んでいます、と私は理解していない構文に遭遇している(と私の避難所は、答えを見つけることができます):Scalaは関数のシンタックス

object Demo { 
    def main(args: Array[String]) { 
    println(apply(layout, 10)) 
    } 

    def apply(f: Int => String, v: Int) = f(v) 

    def layout[A](x: A) = "[" + x.toString() + "]" 
} 

def layout[A](x: A) = "[" + x.toString() + "]" 

レイアウト後と引数宣言の前に[A]を理解できません。

返品のタイプですか?

私の場合、スカラの関数の一般的な構文は次のとおりです。

def functionName ([list of parameters]) : [return type] = { 
    function body 
    return [expr] 
} 

答えて

4

Aはタイプパラメータと呼ばれるものです。型パラメータを使用すると、Aのメソッドを一般的に記述できます。 AIntDouble、またはあなたが作成したカスタムクラスであってもかまいません。これらはすべてAnyから継承されたtoStringメソッドを持っているので、これは動作します。私たちは例えば

、:

println(layout(1L)) 
println(layout(1f)) 

これは、書き込みと同じです:

型パラメータが明示的に渡され
println(layout[Long](1L)) 
println(layout[Float](1f)) 

+0
+0

この場合、役に立つものは何ですか?どうして 'def layout(x:Any)'だけではないのですか? – Thilo

+1

@Thiloこの特定の例では、あまり意味がありません。 「Any」を使用して同じことを達成することができます。型パラメータを受け入れるメソッドを書くときには、通常、コンパイル時に型情報を保持することから得られる再利用可能なコードがあります。 –

0
def layout[A](x: A) = "[" + x.toString() + "]" 

ここでは[A]がtypeパラメータです。この関数定義では、この型パラメータの引数として任意の型を指定できます。

// If you wanted to use an Int 
layout[Int](5) 

// If you wanted to use a String 
layout[String]("OMG") 

// If you wanted to one of your classes 
case class AwesomeClass(i: Int, s: String) 

layout[AwesomeClass](AwesomeClass(5, "omg")) 

また...この方法def layout[A](x: A) = "[" + x.toString() + "]"で、関数パラメータxtype Aであることが指定されている、Scalaは関数パラメータxから型パラメータを推測するためにこの情報を使用することができます。この方法を使用するときは、実際には次のようにそれほど冗長的に上記のコードを書くことができるように

だから、実際に私がするために、以下、この図を作っ

// As we provided `i : Int` as argument `x`, 
// Scala will infer that type `A` is `Int` in this call 
val i: Int = 5 
layout(i) 

// Scala will infer that type `A` is `String` in this call 
layout("OMG") 

// If you wanted to one of your classes 
case class AwesomeClass(i: Int, s: String) 

// Scala will infer that type `A` is `AwesomeClass` in this call 
layout(AwesomeClass(5, "omg")) 
関連する問題