Ruby 中的列舉
Nurudeen Ibrahim
2023年1月30日
Ruby
Ruby Enum
列舉是一種包含一組固定常量的資料型別,通常對映到整數值。與許多其他程式語言不同,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。
Enjoying our tutorials? Subscribe to DelftStack on YouTube to support us in creating more high-quality video guides. Subscribe