Ruby 中的列舉

Nurudeen Ibrahim 2023年1月30日
  1. 在 Ruby 中使用模組實現列舉
  2. 在 Ruby 中使用 Hash 實現列舉
  3. Rails 中使用 Ruby 的列舉
Ruby 中的列舉

列舉是一種包含一組固定常量的資料型別,通常對映到整數值。與許多其他程式語言不同,Ruby 沒有內建的 Enum 型別。

儘管 Enums 功能是在 Rails 4.1 中使用一些自定義實現引入的。

在 Ruby 中使用模組實現列舉

我們將有一個名為 Status 的列舉,其中包含預定義值集 PENDINGIN_PROGRESSCOMPLETE

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_PROGRESSCOMPLETE

只有當我們想在程式碼的不同區域引用列舉值時,這種設計才有用。

在 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 狀態專案,儲存 1in_progress 儲存 2,儲存 completed 專案 3

Rails 會根據我們的狀態示例在後臺自動建立一些方法,使使用列舉欄位變得容易。

Rails 會自動建立以下有用的方法。

  • statusproject.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