Ruby 中的列舉
Nurudeen Ibrahim
2023年1月30日
2022年5月18日
列舉是一種包含一組固定常量的資料型別,通常對映到整數值。與許多其他程式語言不同,Ruby 沒有內建的 Enum 型別。
儘管 Enums 功能是在 Rails 4.1 中使用一些自定義實現引入的。
在 Ruby 中使用模組
實現列舉
我們將有一個名為 Status
的列舉,其中包含預定義值集 PENDING
、IN_PROGRESS
和 COMPLETE
。
module Status
PENDING = 1
IN_PROGRESS = 2
COMPLETE = 3
end
puts Status::PENDING
puts Status::IN_PROGRESS
puts Status::COMPLETE
輸出:
1
2
3
這三個元素中的每一個都對映到一個整數值,因此無論我們看到 1
的狀態,這意味著我們指的是 PENDING
狀態,而 2 和 3 指的是 IN_PROGRESS
和 COMPLETE
。
只有當我們想在程式碼的不同區域引用列舉值時,這種設計才有用。
在 Ruby 中使用 Hash
實現列舉
STATUS = {
pending: 1,
in_progress: 2,
complete: 3
}
def status_string(value)
STATUS.key(value)
end
puts STATUS[:pending]
puts status_string(2)
輸出:
1
in_progress
上面的設計允許你訪問狀態值和狀態元素(型別)。如果列舉對映到狀態欄位,這很有用。
Rails 中使用 Ruby 的列舉
Rails 4.1 引入了列舉的概念,當你有一個像上面描述的 status
這樣的複雜值需要儲存在資料庫中時,它會派上用場。
例如,一個 Project
模型可以有一個可以是列舉的狀態欄位,我們將其定義如下所示。
## Project model
class Project
##
enum status: {
pending: 1,
in_progress: 2,
complete: 3
}
end
資料庫中的狀態欄位定義為整數字段。對於 pending
狀態專案,儲存 1
,in_progress
儲存 2
,儲存 completed
專案 3
。
Rails 會根據我們的狀態示例在後臺自動建立一些方法,使使用列舉欄位變得容易。
Rails 會自動建立以下有用的方法。
status
:project.status
返回專案的狀態。pending?
:project.pending?
如果專案未決,則返回 true,否則返回 false。in_progress?
:project.in_progress?
如果專案正在進行,則返回 true,否則返回 false。complete?
:project.complete?
如果專案完成則返回 true,否則返回 false。pending!
:project.pending!
將專案的狀態更新為pending
。in_progress!
:project.in_progress!
將專案的狀態更新為in_progress
。complete!
:project.complete!
將專案的狀態更新為complete
。