Crystal編程實踐之(二):飛速上手 – 2

類型推斷

crystal的設計哲學是儘可能的不要求顯式指定數據類型,但也有一些情況下是必須指定類型的。

Crystal編程實踐之(二):飛速上手 – 2

定義一個類及它的構造方法

在上面代碼中@name沒有指明類型,crystal編譯器會掃描所有Person被調用的地方,這樣會有以下問題:

  1. 代碼可讀性差
  2. 不利於編譯優化,當代碼變複雜時編譯時間會變的很長

因此,需要指明類和實例的屬性變量類型。

直接指定數據類型

Crystal編程實踐之(二):飛速上手 – 2

不指定類型

編譯器會使用一系列的規則去匹配,當沒有規則匹配成功時變量的類型將會是一個包含各種類型的聯合類型。在變量沒有初始化的情況下,聯合中還將包括Nil類型。 規則有很多,但常用的一般是前3個匹配,無需瞭解。當編譯器報錯時,顯式的指定類型即可。 下面的規則對於類和實例都適用:

  1. 向變量賦於一個字面量值, 下面的例子@name將被推斷為String類型,@age將是Int32類型。
Crystal編程實踐之(二):飛速上手 – 2

定義時直接用字面量賦值

2.使用類的new方法進行變量賦值,下面的例子@address的類型將被推斷為Address

Crystal編程實踐之(二):飛速上手 – 2

new方法賦值

3.用指定類型的參數進行賦值

Crystal編程實踐之(二):飛速上手 – 2

定義時指定一個確定類型的參數賦值

4.用一個有返回值類型的類方法賦值

Crystal編程實踐之(二):飛速上手 – 2

5.使用一個帶有默認值的參數賦值

Crystal編程實踐之(二):飛速上手 – 2

6.使用Lib庫的調用結果賦值

Crystal編程實踐之(二):飛速上手 – 2

lib庫 的調用通常具體返回值類型

聯合類型(Union types)

表達式或變量可以由多種類型組成,稱之為聯合。

Crystal編程實踐之(二):飛速上手 – 2

上面的代碼片段,a將獲取 Int32和String兩種類型,這個是在編譯時由編譯器確定。在運行時,a只可能取得一種類型。

Crystal編程實踐之(二):飛速上手 – 2

如果有需要,變量可以在編譯時被定義為聯合類型

Crystal編程實踐之(二):飛速上手 – 2

聯合的類型規則 :一般情況下相T1和T2兩種類型聯合,聯合的類型將會是T1 | T2 , 但也有例外。

1.繼承相同Class的類的聯合,返回類型為 class+

Crystal編程實踐之(二):飛速上手 – 2

2.相同大小的元組形成的聯合,返回類型為所有元組數據類型的集合。

Crystal編程實踐之(二):飛速上手 – 2

3.帶有相同Key的命名元祖構成的集合, 看例子

Crystal編程實踐之(二):飛速上手 – 2

重載

類和類的方法都可以重載,方法重載可以寫在同一個類定義中 也可以重複定義相同的類。最新的定義將覆蓋之前的定義。

默認值和命名參數

Crystal編程實踐之(二):飛速上手 – 2

“*” 與元組

通過使用*,方法可以接收不固定數量的參數。

Crystal編程實踐之(二):飛速上手 – 2

Crystal編程實踐之(二):飛速上手 – 2

Crystal編程實踐之(二):飛速上手 – 2

返回類型

方法的返回類型是編譯器自動確定的,但是也可以手動指定類型

Crystal編程實踐之(二):飛速上手 – 2

可見性

使用private關鍵詞定義: private def xxx

Crystal編程實踐之(二):飛速上手 – 2

受保護的(protected)方法: protected def xxx 只能被與當前類型同類型的,或與當前類型在相同命名空間中的(class, struct, module, etc.)實例調用。 例子, ...略

在最外層定義的私有方法 和私有類,只能在定義的當前文件中可見。

繼承

Crystal編程實踐之(二):飛速上手 – 2

如果子類中定義了initialize方法,父類的構造子將不被調用。

Crystal編程實踐之(二):飛速上手 – 2

子類可以重載父類的方法(重寫或者使用類型限制實現多態)。 可以使用super關鍵詞來調用父類方法

抽象類

...略, 請自行研究

類方法

不需要通過實例化就可以調用

Crystal編程實踐之(二):飛速上手 – 2

類屬性

在變量名稱前使用 @@ , 存在於靜態類中 所有實例可以共享之

Crystal編程實踐之(二):飛速上手 – 2

解構方法

在一個實例被回收時調用 finalize

Crystal編程實踐之(二):飛速上手 – 2

模塊

模塊有兩個用途。1,用作命名空間用來隔離定義類和方法,常量等。2,可以當成代碼片段插入其它代碼中。 使用include 或extend

Crystal編程實踐之(二):飛速上手 – 2

泛型

...略

結構體

Crystal編程實踐之(二):飛速上手 – 2

結構體可以當成類來使用 且效率比類高, 它和類的區別在於: 1. 存在於棧中,而不是堆 2. 傳值調用 ,而不是引址 3. 繼承自Struct 4. 不能通過一個抽象的struct來繼承 ...略

常量

以大寫字母開頭的變量, 一般情況下全部使用大寫。

內置常量

  1. __LINE__ , 程序所在文件的當前行號
  2. __END_LINE__ ,程序所在的代碼塊在當前文件中的結束行號
  3. __FILE__, 當前程序文件的完整路徑
  4. __DIR__, 當前程序文件所在的目錄

枚舉類型

枚舉是一組整型值的集合,每個值都有關聯的名稱。。。略

講的有點多了,暫時講到此, 未完待續。。。


分享到:


相關文章: