2012-06-30 71 views
12

自型看起來像以下示例:自我類型中`=>`背後的原因是什麼?

trait A { self: String => } 

這是說,該性狀A(或它的一個子類型)必須繼承類String

關鍵字self後跟:類似物到一個變量中var s: String,其中類型來:之後。

但是=>在自我類型中聲明的是什麼?這背後的原因是什麼?

+1

這是一個奇怪的位語法我認爲,因爲它看起來像一個箭頭,將指向某些東西... – david

+0

是的,在學習斯卡拉開始時,我總是認爲箭頭指向身體的其餘部分,看起來像一個功能,讓我很困惑。 –

回答

11

只是猜測工作...你需要一些自我類型聲明的特定分隔符。想象一下=>只是被省略了。 this: String將是一個語法上有效的語句(儘管類型檢查器會投訴)。

那應該是哪個分隔符?你不會想要像trait A { self: String { ... }}這樣的嵌套花括號。那麼存在哪些不配對的現有分隔符? =>是我能想到的唯一一個。

=>=>在哪裏?作爲函數類型的糖(A => B)和函數體(i: Int => i + 1)。也適用於按名稱參數以及模式匹配的情況。這最後一次使用與自我類型有點相關。這就像匹配this是一個特定的類型,然後根據這個「匹配」來定義主體。我不知道,也許這是一個愚蠢的比喻。

+0

感謝您分享您對該主題的看法。聽起來不錯。我嘗試了一個類似的方向。 –

9

請注意,self不是一個關鍵字,而是一個正常的標識符。你真的可以寫任何其他有效的標識符代替self。並且:在表達式是類型歸屬之後,在表達式有效的任何地方都是完全有效的。

=>是告訴斯卡拉有一個自我類型。否則,self: Type看起來像一個簡單的陳述,一個表達式。例如:

class A 
class B extends A { 
    this: A 
} 

這是有效的Scala代碼,它沒有自我類型。

+0

好點,謝謝。使用'=>'作爲自我類型的符號還是僅僅是因爲它符合Scalas語法的其餘部分? –

+0

@JohnThreepwood Odersky反對保留符號和關鍵字,因此他試圖重複使用他擁有的符號和關鍵字。我認爲,當談到強調時他說得太過分了,但事實就是這樣。 –

0

this在一個類的主體內部,所以在這個意義上它是一個參數(儘管我們從來沒有這樣想過)。自我類型語法只是簡單明瞭,並允許給它一個不同的名稱(和類型)。所以箭頭成爲一個非常好的選擇,作爲活頁夾與其範圍之間的分隔符。

相關問題