2017-04-14 216 views
1

中使用的方法我正在瀏覽斯卡拉代碼,並發現應用方法也用於type使用類型[斯卡拉]

例子:
type Common = { 
    def apply: {val func: {} => {val a: A}; val c: C} => {val b: B} 
} 

是什麼上面的代碼是什麼意思?

據我所知,這意味着Common是指所有包含apply方法的類型。但是,問題是什麼樣的應用方法是否意味着什麼?應用方法的輸入是什麼?

此外,

type Common = { 
    def apply({val func: {} => {val a: A}; val c: C} => {val b: B}) 
} 

是哪兩個普通型的區別?

+0

區別在於第二個是無效的語法。 –

+0

那麼,第一個是什麼意思?該應用方法的輸入是什麼? – kong0329

回答

1

這被稱爲結構類型。它僅僅意味着你通過它的結構而不是(僅)通過它的名字來描述一個類型。 Foo{val a: String}類型的含義是「類型爲Foo,但也有val a: String」。 {val a: String}AnyRef{val a: String}相同。所以{}意味着AnyRef{},這基本上意味着與AnyRef相同。

當然,您也可以在結構類型中使用結構類型,這就是Common所做的。 Common是AnyRef的子類型,它有一個apply方法,該方法不接受任何參數,而是返回一個帶有一些複雜結構類型作爲類型參數的函數。要破譯那些你只需遞歸應用第一段的規則。

您將如何使用此Common類型?我建議不要,但是...的結構類型的方法

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

class A; class B; class C 

type Common = { 
    def apply: {val func: {} => {val a: A}; val c: C} => {val b: B} 
} 

class HasA { val a = new A } 

class HasB { val b = new B } 

class HasC { 
    val func = (a: AnyRef) => new HasA 
    val c = new C 
} 

class MyCommon { def apply = (h: Any) => new HasB } 

// Exiting paste mode, now interpreting. 


scala> def common(c: Common) = c 
common: (c: Common)Common 

scala> common(new MyCommon) 
res0: Common = [email protected] 

scala> res0.apply(new HasC) 
res1: AnyRef{val b: B} = [email protected] 

scala> res1.b 
res2: B = [email protected] 

的調用也可能招致運行時開銷,因爲它們與反射來實現。

+0

你能解釋一下上面的應用方法嗎? – kong0329