Updata commit hash

This commit is contained in:
Cai Bingjun 2022-09-10 21:04:20 +08:00 committed by GitHub
parent b0ea54cbb0
commit 3204ea06bb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1,13 +1,13 @@
# Class # Class
[![badge](https://img.shields.io/endpoint.svg?url=https%3A%2F%2Fgezf7g7pd5.execute-api.ap-northeast-1.amazonaws.com%2Fdefault%2Fsource_up_to_date%3Fowner%3Derg-lang%26repos%3Derg%26ref%3Dmain%26path%3Ddoc/EN/syntax/type/04_class.md%26commit_hash%3D51de3c9d5a9074241f55c043b9951b384836b258)](https://gezf7g7pd5.execute-api.ap-northeast-1.amazonaws.com/default/source_up_to_date?owner=erg-lang&repos=erg&ref=main&path=doc/EN/syntax/type/04_class.md&commit_hash=51de3c9d5a9074241f55c043b9951b384836b258) [![badge](https://img.shields.io/endpoint.svg?url=https%3A%2F%2Fgezf7g7pd5.execute-api.ap-northeast-1.amazonaws.com%2Fdefault%2Fsource_up_to_date%3Fowner%3Derg-lang%26repos%3Derg%26ref%3Dmain%26path%3Ddoc/EN/syntax/type/04_class.md%26commit_hash%3D1ae76335017dda8c599203146232956aa8b5b73e)](https://gezf7g7pd5.execute-api.ap-northeast-1.amazonaws.com/default/source_up_to_date?owner=erg-lang&repos=erg&ref=main&path=doc/EN/syntax/type/04_class.md&commit_hash=1ae76335017dda8c599203146232956aa8b5b73e)
Erg 中的類大致是一種可以創建自己的元素(實例)的類型。 Erg 中的類大致是一種可以創建自己的元素(實例)的類型。
這是一個簡單類的示例。 這是一個簡單類的示例。
```python ```python
Person = Class {.name = Str; .age = Nat} Person = Class {.name = Str; .age = Nat}
# 如果 `.new` 沒有定義,那 Erg 將創建 `Person.new = Person::__new__` # 如果 `.new` 沒有定義,那 Erg 將創建 `Person.new = Person::__new__`
Person. Person.
new name, age = Self::__new__ {.name = name; .age = age} new name, age = Self::__new__ {.name = name; .age = age}
@ -25,10 +25,10 @@ print! classof(john) # Person
請注意,以下不帶換行符的定義將導致語法錯誤。 請注意,以下不帶換行符的定義將導致語法錯誤。
```python ```python
Person.new name, age = ... # 語法錯誤:不能直接在對上定義屬性 Person.new name, age = ... # 語法錯誤:不能直接在對上定義屬性
``` ```
> __Warning__:這是最近添加的規范,后續文檔中可能不會遵循。 如果你發現它,請報告它。 > __Warning__:這是最近添加的規範,後續文檔中可能不會遵循。如果你發現它,請報告它。
## 實例和類屬性 ## 實例和類屬性
@ -58,7 +58,7 @@ Person = Class {
``` ```
元素屬性(在記錄中定義的屬性)和類型屬性(也稱為實例/類屬性,尤其是在類的情況下)是完全不同的東西。類型屬性是類型本身的屬性。當一個類型的元素本身沒有所需的屬性時,它指的是一個類型屬性。元素屬性是元素直接擁有的唯一屬性。 元素屬性(在記錄中定義的屬性)和類型屬性(也稱為實例/類屬性,尤其是在類的情況下)是完全不同的東西。類型屬性是類型本身的屬性。當一個類型的元素本身沒有所需的屬性時,它指的是一個類型屬性。元素屬性是元素直接擁有的唯一屬性。
為什么要進行這種區分? 如果所有屬性都是元素屬性,那么在創建對象時復制和初始化所有屬性將是低效的。 為什麼要進行這種區分?如果所有屬性都是元素屬性,那麼在創建對象時復制和初始化所有屬性將是低效的。
此外,以這種方式劃分屬性明確了諸如“該屬性是共享的”和“該屬性是分開持有的”之類的角色。 此外,以這種方式劃分屬性明確了諸如“該屬性是共享的”和“該屬性是分開持有的”之類的角色。
下面的例子說明了這一點。 `species` 屬性對所有實例都是通用的,因此將其用作類屬性更自然。但是,屬性 `name` 應該是實例屬性,因為每個實例都應該單獨擁有它。 下面的例子說明了這一點。 `species` 屬性對所有實例都是通用的,因此將其用作類屬性更自然。但是,屬性 `name` 應該是實例屬性,因為每個實例都應該單獨擁有它。
@ -111,7 +111,7 @@ MyStr.
`-` self, other: Str = self.replace other, "" `-` self, other: Str = self.replace other, ""
abc = MyStr.new("abc") abc = MyStr.new("abc")
# 這的比較是向上的 # 這的比較是向上的
assert abc - "b" == "ac" assert abc - "b" == "ac"
``` ```
@ -128,10 +128,10 @@ InheritableMyStr = Inherit Str
MyStr3 = Inherit InheritableMyStr # OK MyStr3 = Inherit InheritableMyStr # OK
``` ```
`Inherit Object``Class()` 在實踐中幾乎是等價的。 一般使用后者。 `Inherit Object``Class()` 在實踐中幾乎是等價的。一般使用後者。
類具有與類型不同的等價檢查機制。 類具有與類型不同的等價檢查機制。
類型基其結構進行等效性測試。 類型基其結構進行等效性測試。
```python ```python
Person = {.name = Str; .age = Nat} Person = {.name = Str; .age = Nat}
@ -151,7 +151,7 @@ Person == Human # 類型錯誤:無法比較類
## 與結構類型的區別 ## 與結構類型的區別
我們說過類是一種可以生成自己的元素的類型,但這并不是嚴格的描述。 事實上,一個記錄類型+補丁可以做同樣的事情。 我們說過類是一種可以生成自己的元素的類型,但這並不是嚴格的描述。事實上,一個記錄類型+補丁可以做同樣的事情。
```python ```python
Person = {.name = Str; .age = Nat} Person = {.name = Str; .age = Nat}
@ -169,7 +169,7 @@ john = Person.new("John Smith", 25)
~ ~
類的類型檢查只是檢查對象的`。 __class__` 對象的屬性。 因此可以快速檢查一個對象是否屬于一個類型。 類的類型檢查只是檢查對象的`。 __class__` 對象的屬性。因此可以快速檢查一個對像是否屬於一個類型。
~ ~
@ -202,12 +202,12 @@ Person = Class {.name = Str; .age = Nat}
Person.greet self = log "Hello, my name is {self.name}." Person.greet self = log "Hello, my name is {self.name}."
john = Person.new {.name = "John Smith"; .age = 20} john = Person.new {.name = "John Smith"; .age = 20}
john.bark() # 類型錯誤: `Person`沒有方法 `.bark` john.bark() # 類型錯誤: `Person`沒有方法 `.bark`
``` ```
另一個特點是補丁添加的類型屬性是虛擬的,實現類不作為實體保存。 另一個特點是補丁添加的類型屬性是虛擬的,實現類不作為實體保存。
也就是說,`T.x``T.bar` 是可以通過與 `{i = Int}` 兼容的類型訪問(編譯時綁定)的對象,且未在 `{i = Int}`` C` 也就是說,`T.x``T.bar` 是可以通過與 `{i = Int}` 兼容的類型訪問(編譯時綁定)的對象,且未在 `{i = Int}`` C`
相反,類屬性由類本身持有。 因此,它們不能被不處于繼承關系的類訪問,即使它們具有相同的結構。 相反,類屬性由類本身持有。因此,它們不能被不處於繼承關係的類訪問,即使它們具有相同的結構。
```python ```python
C = Class {i = Int} C = Class {i = Int}
@ -232,8 +232,8 @@ C.new({i = 1}).bar # <方法 bar>
## 與數據類的區別 ## 與數據類的區別
有兩種類型的類:常規類,通過`Class`成為記錄類,以及從記錄類繼承(`Inherit`)的數據類。 有兩種類型的類:常規類,通過`Class`成為記錄類,以及從記錄類繼承(`Inherit`)的數據類。
數據類繼承了記錄類的功能,具有分解賦值、默認實現的`==``hash`等特性。另一方面,數據類有自己的等價關和格式展示。 數據類繼承了記錄類的功能,具有分解賦值、默認實現的`==``hash`等特性。另一方面,數據類有自己的等價關和格式展示。
另一方面,如果要定義自己的等價關或格式顯示,則應使用普通類。 另一方面,如果要定義自己的等價關或格式顯示,則應使用普通類。
```python ```python
C = Class {i = Int} C = Class {i = Int}
@ -243,15 +243,15 @@ print! c # <C object>
c == d # 類型錯誤:`==` 沒有為 `C` 實現 c == d # 類型錯誤:`==` 沒有為 `C` 實現
D = Inherit {i = Int} D = Inherit {i = Int}
e = D.new {i = 1} e = D::{i = 1} # 與`e = D.new {i = 1}`相同
f = D.new {i = 2} f = D::{i = 2}
print! e # D{i = 1} print! e # D(i=1)
assert e ! = f assert e ! = f
``` ```
## 枚舉類 ## 枚舉類
為了便定義“Or”類型的類提供了一個“Enum”。 為了便定義“Or”類型的類提供了一個“Enum”。
```python ```python
X = Class() X = Class()
@ -260,7 +260,7 @@ XorY = Enum X, Y
``` ```
每種類型都可以通過`XorY.X``XorY.Y`來訪問,構造函數可以通過`XorY.cons(X)`獲得。 每種類型都可以通過`XorY.X``XorY.Y`來訪問,構造函數可以通過`XorY.cons(X)`獲得。
`.cons` 是一個接受類返回其構造函數的方法。 `.cons` 是一個接受類返回其構造函數的方法。
```python ```python
x1 = XorY.new X.new() x1 = XorY.new X.new()
@ -268,7 +268,7 @@ x2 = XorY.cons(X)()
assert x1 == x2 assert x1 == x2
``` ```
## 類關 ## 類關
類是需求類型的子類型。類中可以使用需求類型的方法(包括補丁方法)。 類是需求類型的子類型。類中可以使用需求類型的方法(包括補丁方法)。