Skip to content

Commit

Permalink
[zh-hant] Update multiple lessons to latest Version (elixirschool#1714)
Browse files Browse the repository at this point in the history
* [zh-hant] Update index.md to 2.0.0

* [zh-hant] Update advanced/typespec to 1.0.3

* [zh-hant] Update basics/basics to 1.2.1

* [zh-hant] Update basics/collections to 1.2.5

* [zh-hant] Update basics/documentation to 1.0.3

* [zh-hant] Update basics/modules to 1.4.0

* [zh-hant] Update specifics/mnesia to 1.1.0

* [zh-hant] Update specifics/plug to 2.2.0

* [zh-hant] Update and Retranslate ecto/basics to 2.1.0
  • Loading branch information
lithiumpie authored and doomspork committed Mar 4, 2019
1 parent ef99816 commit ee01128
Show file tree
Hide file tree
Showing 9 changed files with 611 additions and 483 deletions.
29 changes: 8 additions & 21 deletions zh-hant/index.md
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
---
title: Elixir School
layout: home
version: 1.0.0
version: 2.0.0
---

[![License](//img.shields.io/badge/license-MIT-brightgreen.svg)](http:https://opensource.org/licenses/MIT)
Elixir School 是冀望學習和掌握 Elixir 程式語言人們的首選之地。

啟發自 Twitter [Scala School](http:https://twitter.github.io/scala_school/) 的 Elixir 程式語言課程
無論您是經驗豐富的老將,還是初來乍到的新人,都可以在課程和輔助資源中找到所需要的東西。

Available in [Việt ngữ][vi], [汉语][cn], [Español][es], [Slovenčina][sk], [日本語][ja], [Polski][pl], [Português][pt], [Русском][ru], [Bahasa Indonesia][id], [Bahasa Melayu][ms], [Українською][uk], [한국어][ko], [Italiano][it], [Deutsch][de], [বাংলা][bn], [Türkçe][tr], [ภาษาไทย][th], [中文][tw] and others.
通過自願譯者們的辛勤工作 Elixir School 已被翻譯成多種語言。其中一些譯文包括: [Việt ngữ][vi], [简体中文][zh-hans], [繁體中文][zh-hant], [Español][es], [Slovenčina][sk], [日本語][ja], [Polski][pl], [Português][pt], [Русском][ru], [Bahasa Indonesia][id], [Bahasa Melayu][ms], [Українською][uk], [한국어][ko], [Italiano][it], [Deutsch][de], [বাংলা][bn], [Türkçe][tr], and [ภาษาไทย][th].

我們歡迎並鼓勵您加入我們,並期望因您加入 [elixirschool/elixirschool](https://github.com/elixirschool/elixirschool) 而繼續讓 Elixir School 變得更好!

[cn]: /cn/
[es]: /es/
[it]: /it/
[ja]: /ja/
Expand All @@ -27,19 +28,5 @@ Available in [Việt ngữ][vi], [汉语][cn], [Español][es], [Slovenčina][sk]
[bn]: /bn/
[tr]: /tr/
[th]: /th/
[tw]: /tw/

_歡迎您的回饋和參與!_

## 關於 Elixir

"Elixir 是一個動態的函數式程式語言,設計來建造可擴充和易維護的應用程式。" — [elixir-lang.org](http:https://elixir-lang.org/)

Elixir 利用 Erlang VM (BEAM) 的實戰經驗來構建分散式且啟動時即低延遲的容錯系統。

__特色__:

+ 可擴充 (Scalable)
+ 故障容錯 (Fault-tolerant)
+ 函數程式設計 (Functional Programming)
+ 可延伸 (Extensible)
[zh-hans]: /zh-hans/
[zh-hant]: /zh-hant/
53 changes: 38 additions & 15 deletions zh-hant/lessons/advanced/typespec.md
Original file line number Diff line number Diff line change
@@ -1,22 +1,30 @@
---
version: 1.0.2
version: 1.0.3
title: 規範和型別
---

在本課程中,將學習 `@spec``@type` 語法。 `@spec` 提供更多的語法補語來編寫能以工具分析的文件。
`@type` 則幫助我們編寫更易讀易懂的程式碼。
在本課程中,將學習 `@spec``@type` 語法。
`@spec` 提供更多的語法補語來編寫能以工具分析的文件。
`@type` 則幫助我們編寫更易讀易懂的程式碼。

{% include toc.html %}

## 簡介

想描述函數介面 (interface) 的需求並不少見,能夠使用 [@doc annotation](../../basics/documentation) 做到,但這只是給與其他開發者在編輯期間的未驗證資訊。而為此,Elixir 有著 `@spec` 註解來描述將由編譯器驗證的函數規範。
想描述函數介面 (interface) 的需求並不少見,
能夠使用 [@doc annotation](../../basics/documentation) 做到,但這只是給與其他開發者在編輯期間的未驗證資訊。
而為此,Elixir 有著 `@spec` 註解來描述將由編譯器驗證的函數規範。

但是在某些情況下,規範 (specification) 將會相當大且複雜。如果想降低複雜性,將會想要引入自定型別定義 (custom type definition)。Elixir 則為此提供 `@type` 註解。但另一方面,Elixir 仍然是動態語言。這意味著關於型別的所有資訊將被編譯器忽略,但可以被其他工具使用。
但是在某些情況下,規範 (specification) 將會相當大且複雜。
如果想降低複雜性,將會想要引入自定型別定義 (custom type definition)。
Elixir 則為此提供 `@type` 註解。
但另一方面,Elixir 仍然是動態語言。
這意味著關於型別的所有資訊將被編譯器忽略,但可以被其他工具使用。

## 規範

如果有使用 Java 或 Ruby 的經驗,可以將規範視為 `interface`。規範被定義為函數參數的型別和回傳值應該是什麼。
如果有使用 Java 的經驗,可以將規範視為 `interface`
規範被定義為函數參數的型別和回傳值應該是什麼。

為了定義輸入和輸出的型別,在函數的定義之前使用 `@spec` 指令,並將其作為一個 `params` 名稱的函數、參數型別列表和在 `::` 型別後的回傳值。

Expand All @@ -31,13 +39,21 @@ def sum_product(a) do
end
```

一切看起來都不錯,且當呼用時有效 (valid) 結果將會回傳,但函數 `Enum.sum` 則回傳 `number` 而不是像在 `@spec` 中預期的 `integer`。這可能就是 bugs 來源!所以有像 Dialyzer 這樣的工具可以對程式碼進行靜態分析,以幫助我們找到這種類型的 bug,我們將會在另一堂課程中談論它。
一切看起來都不錯,且當呼用時有效 (valid) 結果將會回傳,但函數 `Enum.sum` 則回傳 `number` 而不是像在 `@spec` 中預期的 `integer`
這可能就是 bugs 來源!所以有像 Dialyzer 這樣的工具可以對程式碼進行靜態分析,以幫助我們找到這種類型的 bug。
我們將會在另一堂課程中談論它。

## 自訂型別

編寫規範很好,但有時函數是工作在比簡單數字或集合更複雜的資料結構中。在 `@spec` 這個定義的情況下,可能很難讓其他開發者來理解和/或改變。有時函數需要處理大量的參數或回傳複雜的資料。一個冗長的參數列表是程式碼中許多潛在的不良氣味 (bad smells) 之一。在像 Ruby 或 Java 這樣的物件導向語言 (object oriented-languages) 中,可以很容易地藉由定義類別 (class) 來幫助我們解決這個問題。雖然 Elixir 沒有類別,但因很容易擴展,仍可以定義型別。
編寫規範很好,但有時函數是工作在比簡單數字或集合更複雜的資料結構中。
`@spec` 這個定義的情況下,可能很難讓其他開發者來理解和/或改變。
有時函數需要處理大量的參數或回傳複雜的資料。
一個冗長的參數列表是程式碼中許多潛在的不良氣味 (bad smells) 之一。
在像 Ruby 或 Java 這樣的物件導向語言 (object oriented-languages) 中,可以很容易地藉由定義類別 (class) 來幫助我們解決這個問題。
雖然 Elixir 沒有類別,但因很容易擴展,仍可以定義型別。

現成的 Elixir 包含一些基本型別,如 `integer``pid`。可以在 [documentation](https://hexdocs.pm/elixir/typespecs.html#types-and-their-syntax) 中找到可用型別的完整清單。
現成的 Elixir 包含一些基本型別,如 `integer``pid`
可以在 [documentation](https://hexdocs.pm/elixir/typespecs.html#types-and-their-syntax) 中找到可用型別的完整清單。

### 定義自訂型別

Expand All @@ -55,12 +71,17 @@ def sum_times(a, params) do
end
```

我們在 `Examples` 模組中引入了一個結構體,它包含兩個域 (fields) `first``last`
這是自 `Range` 模組來的較簡易結構體版本。當談論到 [modules](../../basics/modules/#structs) 時,同時將討論 `structs`。現在想像一下,我們需要在很多地方用 `Examples` 結構體來做規範。但寫出冗長而複雜的規範會很煩人,且可能成為 bug 的來源。一個解決這個問題的方法是 `@type`
`Examples` 模組中引入了一個結構體,它包含兩個欄位 (fields) `first``last`
這是自 `Range` 模組來的較簡易結構體版本。
如需更多 `structs` 資訊,請參考 [modules](../../basics/modules/#structs)
現在想像一下,我們需要在很多地方用 `Examples` 結構體來做規範。
但寫出冗長而複雜的規範會很煩人,且可能成為 bug 的來源。
一個解決這個問題的方法是 `@type`

Elixir 對於型別有三種指令:

- `@type` – 簡易、公開型別,型別內部結構是公開的。
- `@type` – 簡易、公開型別,
型別內部結構是公開的。
- `@typep` – 型別是私有的,只能在被定義的模組中使用。
- `@opaque` – 型別是公開的,但內部結構是私有的。

Expand All @@ -79,8 +100,8 @@ end
我們已經定義了 `t(first, last)` 型別,它是結構體 `%Examples{first: first, last: last}` 的再現。
在這一點上,我們看到型別可以接受參數,但也定義型別 `t` ,這次它是結構體 `%Examples{first: integer, last: integer}` 的再現。

有什麼區別?第一個再現 `Examples` 的結構體,其中兩個鍵 (keys) 可以是任何型別。第二個則再現鍵是 `integers` 的結構體。

有什麼區別?第一個再現 `Examples` 的結構體,其中兩個鍵 (keys) 可以是任何型別。
第二個則再現鍵是 `integers` 的結構體。
這意味著這樣的程式碼:

```elixir
Expand Down Expand Up @@ -111,7 +132,9 @@ end

### 型別的文件

我們需要談論的最後一個元素是如何註解型別。正如從 [documentation](../../basics/documentation) 課程中學到的,有 `@doc``@moduledoc` 註解來為函數和模組建立文件。為了註解型別,可以使用 `@typedoc`
我們需要談論的最後一個元素是如何註解型別。
正如從 [documentation](../../basics/documentation) 課程中學到的,有 `@doc``@moduledoc` 註解來為函數和模組建立文件。
為了註解型別,可以使用 `@typedoc`

```elixir
defmodule Examples do
Expand Down
27 changes: 18 additions & 9 deletions zh-hant/lessons/basics/basics.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
version: 1.1.2
version: 1.2.1
title: 基礎
---

Expand All @@ -15,6 +15,9 @@ title: 基礎

在安裝 Elixir 後,您可以簡便確認安裝的版本。

% elixir -v
Erlang/OTP {{ site.erlang.OTP }} [erts-{{ site.erlang.erts }}] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

Elixir {{ site.elixir.version }}

### 試用互動模式
Expand All @@ -23,6 +26,8 @@ Elixir 自帶 IEx,一個互動模式 shell,可以讓我們隨時計算 Elixi

輸入 `iex` 開始使用:

Erlang/OTP {{ site.erlang.OTP }} [erts-{{ site.erlang.erts }}] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

Interactive Elixir ({{ site.elixir.version }}) - press Ctrl+C to exit (type h() ENTER for help)
iex>

Expand All @@ -37,8 +42,7 @@ iex> String.length("The quick brown fox jumps over the lazy dog")
43
```

如果你不了解每一個式子,不用擔心,但我們希望你有些概念了
如果你不了解每一個式子,不用擔心,但希望你有些概念了。

## 基本資料型別

Expand Down Expand Up @@ -73,7 +77,6 @@ iex> 1.0e-10
1.0e-10
```


### 布林

Elixir 支援 `true``false` 做為布林的值;除了 `false``nil`,一切為真。
Expand All @@ -87,7 +90,8 @@ false

### Atoms

Atom 是一個常數,其名稱是它的值。如果你熟悉 Ruby,這與 Ruby 的符號 (Symbols) 是同義詞:
Atom 是一個常數,其名稱是它的值。
如果你熟悉 Ruby,這與 Ruby 的符號 (Symbols) 是同義詞:

```elixir
iex> :foo
Expand Down Expand Up @@ -142,13 +146,15 @@ iex> "foo\nbar"
"foo\nbar"
```

Elixir 還包括更複雜的資料型別。當我們學習 [collections](../collections/)[functions](../functions/) 時我們將進一步了解這些。
Elixir 還包括更複雜的資料型別。
當學習 [群集](../collections/)[函數](../functions/) 時將進一步了解這些。

## 基本運算

### 算術運算 (Arithmetic)

Elixir 如你所料支援基本運算子 `+``-``*``/`。 重要的是記住 `/` 將永遠回傳一個浮點數:
Elixir 如你所料支援基本運算子 `+``-``*``/`
重要的是記住 `/` 將永遠回傳一個浮點數:

```elixir
iex> 2 + 2
Expand All @@ -172,7 +178,8 @@ iex> rem(10, 3)

### 布林運算 (Boolean)

Elixir 提供 `||``&&``!` 布林運算子。 這些支援任何型別:
Elixir 提供 `||``&&``!` 布林運算子。
這些支援任何型別:

```elixir
iex> -20 || true
Expand Down Expand Up @@ -206,6 +213,8 @@ iex> not 42
** (ArgumentError) argument error
```

註:Elixir 的 `and``or` 實際上映射到 Erlang 中的 `andalso``orelse`

### 比較運算 (Comparison)

Elixir 帶有我們習慣的所有比較運算子: `==``!=``===``!==``<=``>=``<``>`
Expand Down Expand Up @@ -263,4 +272,4 @@ iex> "Hello #{name}"
iex> name = "Sean"
iex> "Hello " <> name
"Hello Sean"
```
```
28 changes: 16 additions & 12 deletions zh-hant/lessons/basics/collections.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
version: 1.2.4
version: 1.2.5
title: 群集
---

Expand All @@ -16,7 +16,9 @@ iex> [3.14, :pie, "Apple"]
[3.14, :pie, "Apple"]
```

Elixir 以串列實現群集列表。這意味著存取列表長度是一個線性時間 `O(n)` 的運算。因此,通常前置插入 (prepend) 比後綴置入 (append) 更快:
Elixir 以串列實現群集列表。
這意味著存取列表長度是一個線性時間 `O(n)` 的運算。
因此,通常前置插入 (prepend) 比後綴置入 (append) 更快:

```elixir
iex> list = [3.14, :pie, "Apple"]
Expand All @@ -29,7 +31,6 @@ iex> list ++ ["Cherry"]
[3.14, :pie, "Apple", "Cherry"]
```


### 列表串接 (List Concatenation)

列表串接使用 `++/2` 運算子:
Expand Down Expand Up @@ -57,8 +58,7 @@ iex> [1,2,2,3,2,3] -- [1,2,3,2]
[2, 3]
```

**註:** 列表減法使用 [strict comparison](../basics/#comparison) 來配對它的值。

**註:** 列表減法使用 [strict comparison](../basics/#comparison) 來配對它的值。例如:
```elixir
iex> [2] -- [2.0]
[2]
Expand All @@ -68,7 +68,9 @@ iex> [2.0] -- [2.0]

### 頭 / 尾 (Head / Tail)

使用列表時,常常操作列表的頭和尾。頭是列表的第一個元素,而尾是包含剩餘元素的列表。在這個部份的操作中 Elixir 提供了兩個有用的函式 `hd``tl`
使用列表時,常常操作列表的頭和尾。
頭是列表的第一個元素,而尾是包含剩餘元素的列表。
在這個部份的操作中 Elixir 提供了兩個有用的函式 `hd``tl`

```elixir
iex> hd [3.14, :pie, "Apple"]
Expand All @@ -77,8 +79,7 @@ iex> tl [3.14, :pie, "Apple"]
[:pie, "Apple"]
```

除了上述函式外,您還可以使用 [pattern matching](../pattern-matching/) 和建構運算子 (con operator) `|`
來將列表分成頭和尾。我們將在之後的課程中學習更多這種用法:
除了上述函式外,您還可以使用 [pattern matching](../pattern-matching/) 和建構運算子 (con operator) `|` 來將列表分成頭和尾。我們將在之後的課程中學習更多這種用法:

```elixir
iex> [head | tail] = [3.14, :pie, "Apple"]
Expand All @@ -91,7 +92,8 @@ iex> tail

## 元組 (Tuples)

元組與列表相似,但以連續的方式儲存在內部記憶體中。這能快速存取它的長度 (length),但當需要修改時則付出昂貴代價;新的元組必須完整複製到內部記體中。元組使用大括號定義:
元組與列表相似,但以連續的方式儲存在內部記憶體中。
這能快速存取它的長度 (length),但當需要修改時則付出昂貴代價;新的元組必須完整複製到內部記體中。元組使用大括號定義:

```elixir
iex> {3.14, :pie, "Apple"}
Expand All @@ -109,7 +111,8 @@ iex> File.read("path/to/unknown/file")

## 關鍵字列表 (Keyword lists)

關鍵字列表和映射是 Elixir 的關聯群集。在 Elixir 中,關鍵字列表是一個特殊的2元素元組列表,列表中第一個元素是一個 atom;它們與列表共享效能:
關鍵字列表和映射是 Elixir 的關聯群集。
在 Elixir 中,關鍵字列表是一個特殊的 2 元素元組列表,列表中第一個元素是一個 atom;它們與列表共享效能:

```elixir
iex> [foo: "bar", hello: "world"]
Expand All @@ -122,13 +125,14 @@ iex> [{:foo, "bar"}, {:hello, "world"}]

+ 鍵 (Keys) 為 atoms。
+ 鍵 (Keys) 為有序。
+ 鍵 (Keys) 可不是唯一
+ 鍵 (Keys) 不必為唯一

由於這些原因,關鍵字列表最常用於將選項傳遞給函數。

## 映射 (Maps)

Elixir 中,映射是使用鍵值的方便選擇 ("go-to" key-value store)。與關鍵字列表不同,它允許任何資料型別做為鍵並且不需排序。你可以用 `%{}` 語法,來定義一個映射:
Elixir 中,映射是使用鍵值的方便選擇 ("go-to" key-value store)。
與關鍵字列表不同,它允許任何資料型別做為鍵並且不需排序。你可以用 `%{}` 語法,來定義一個映射:

```elixir
iex> map = %{:foo => "bar", "hello" => :world}
Expand Down
Loading

0 comments on commit ee01128

Please sign in to comment.