# 技術常見問題

[![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/faq_technical.md%26commit_hash%3Dc6eb78a44de48735213413b2a28569fdc10466d0)](https://gezf7g7pd5.execute-api.ap-northeast-1.amazonaws.com/default/source_up_to_date?owner=erg-lang&repos=erg&ref=main&path=doc/EN/faq_technical.md&commit_hash=c6eb78a44de48735213413b2a28569fdc10466d0)

本節回答有關使用 Erg 語言的技術問題。換句話說，它包含以 What 或 Which 開頭的問題，以及可以用 Yes/No 回答的問題

有關如何確定語法的更多信息，請參閱 [此處](./faq_syntax.md) 了解基礎語法決策，以及 [此處](./faq_general.md)

## Erg 中有異常機制嗎?

答: 不會。Erg 使用 `Result` 類型代替。請參閱 [此處](./faq_syntax.md) 了解 Erg 沒有異常機制的原因

## Erg 是否有與 TypeScript 的 `Any` 等價的類型?

答: 不，沒有。所有對象都至少屬于 `Object` 類，但是這種類型只提供了一組最小的屬性，所以你不能像使用 Any 那樣對它做任何你想做的事情
`Object` 類通過`match` 等動態檢查轉換為所需的類型。它與Java 和其他語言中的`Object` 是同一種
在 Erg 世界中，沒有像 TypeScript 那樣的混亂和絕望，其中 API 定義是"Any"

## Never、{}、None、()、NotImplemented 和 Ellipsis 有什么區別?

A: `Never` 是一種"不可能"的類型。產生運行時錯誤的子例程將"Never"(或"Never"的合并類型)作為其返回類型。該程序將在檢測到這一點后立即停止。盡管 `Never` 類型在定義上也是所有類型的子類，但 `Never` 類型的對象永遠不會出現在 Erg 代碼中，也永遠不會被創建。`{}` 等價于 `Never`
`Ellipsis` 是一個表示省略號的對象，來自 Python
`NotImplemented` 也來自 Python。它被用作未實現的標記，但 Erg 更喜歡產生錯誤的 `todo` 函數
`None` 是 `NoneType` 的一個實例。它通常與 `Option` 類型一起使用
`()` 是一個單元類型和它自己的一個實例。當您想要返回"無意義的值"(例如過程的返回值)時使用它

## 為什么 `x = p!()` 有效但 `f() = p!()` 會導致 EffectError?

`!` 不是副作用產品的標記，而是可能導致副作用的對象
過程 `p!` 和可變類型 `T!` 會引起副作用，但如果 `p!()` 的返回值是 `Int` 類型，它本身就不再引起副作用

## 當我嘗試使用 Python API 時，對于在 Python 中有效的代碼，我在 Erg 中收到類型錯誤。這是什么意思?

A: Erg API 的類型盡可能接近 Python API 規范，但有些情況無法完全表達
此外，根據規范有效但被認為不合需要的輸入(例如，在應該輸入 int 時輸入浮點數)可能會被 Erg 開發團隊酌情視為類型錯誤。

## Why doesn't Tuple have a constructor (`__call__`)?

Erg tuples must have a compile-time length. Therefore, a tuple is constructed almost only by a tuple literal.
If the length is not known until runtime, an immutable array (`List`) can be used instead.

```erg
arr = List map(int, input!().split " ")
```

## I got runtime errors in Erg that I did not get in Python. What could be the cause?

The following script is an example of a strange error that can occur in Erg.

```erg
{main!; TestCase!} = pyimport "unittest"

Test! = Inherit TestCase!
Test!
    test_one self =
        self.assertEqual 1, 1

main!()
```

This is a basic use of unittest, and at first glance it looks correct, but when executed, it produces the following error:

```console
AttributeError: 'Test!' object has no attribute '_testMethodName'.
```

The error is caused by the way `TestCase` is executed.
When `TestCase` (a class that extends `TestCase`) is executed, the test method to be executed must begin with `test_`.
`test_one` seems to follow this, but Erg performs mangling on variable names.
This is what makes the test method unrecognizable.
To avoid mangling, you need to enclose the name in ''.

```erg
{main!; TestCase!} = pyimport "unittest"

Test! = Inherit TestCase!
Test!
    'test_one' self =
        self.assertEqual 1, 1

main!()
```

This time it works.

If you get Erg-specific errors, you can suspect the side-effects of mangling, etc.

## All Python APIs used from Erg have type declarations based on the latest Python version, does this mean that older versions of Python are not supported?

No. Erg is compatible with Python versions from 3.7 to the latest.
Erg uses its own code generator and libraries to absorb the differences between versions of the Python API.
If it does not, it is a bug and please report it to [issues](https://github.com/erg-lang/erg/issues/new) on GitHub.
