tôi muốn thêm làm thế nào tôi đã bắt đầu làm hằng, đó là tương tự như câu trả lời @Onorio Catenacci của, nhưng sử dụng trích dẫn:
defmodule IbGib.Constants do
@doc """
Use this with `use IbGib.Constants, :ib_gib`
"""
def ib_gib do
quote do
defp delim, do: "^"
defp min_id_length, do: 1
# etc...
end
end
@doc """
Use this with `use IbGib.Constants, :error_msgs`
"""
def error_msgs do
quote do
defp emsg_invalid_relations do
"Something about the rel8ns is invalid. :/"
end
# etc...
end
end
@doc """
When used, dispatch to the appropriate controller/view/etc.
"""
defmacro __using__(which) when is_atom(which) do
apply(__MODULE__, which, [])
end
end
Và sau đó bạn sử dụng nó như thế này ở phía trên cùng của module, nơi bạn muốn tiêu thụ chúng:
use IbGib.Constants, :ib_gib # < specifies only the ib_gib constants
use IbGib.Constants, :error_msgs
# ... then in some function
Logger.error emsg_invalid_relations
Tôi nhận được điều này với cách Phoenix nhập khẩu/sử dụng mệnh đề với MyApp.Web. Tôi không ở đâu gần một chuyên gia Elixir, nhưng với phương pháp này, bạn có thể nhập chỉ những hằng số mà bạn muốn và bạn không cần phải thêm tiền tố cho chúng với bất kỳ sự sắp xếp/sắp xếp tên nào. Bằng cách này, bạn có thể chọn và chọn từng nhóm hằng số một cách dễ dàng.
Với các hàm thẳng, (tôi nghĩ) bạn sẽ phải chia chúng thành nhiều mô-đun và sau đó nhập mô-đun.
Tôi không biết các chi nhánh tối ưu hóa này vs chức năng mô-đun trực tiếp, nhưng tôi nghĩ rằng nó là khá gọn gàng - đặc biệt đối với thực tiễn giữa các cách khác nhau để "nhập khẩu" những điều trong Elixir (import
, use
, alias
, require
là rất khó hiểu với tư cách là người mới bắt đầu đến từ các ngôn ngữ khác, đây là một tuyên bố đơn using
hoặc import
).
CHỈNH SỬA: Tôi đã thay đổi các khai báo def
không đổi thành defp
. Điều này là do khi nhiều mô-đun import
tệp hằng số, có một xung đột mơ hồ. Thay đổi chúng thành các chức năng riêng lẻ để tránh xung đột này. Vì vậy, mỗi mô-đun có "bản sao riêng" của chính nó cùng một hằng số.
nhưng @my_favorite_num không thể truy cập được từ bên ngoài mô-đun –
@lfx_cool đúng. nếu bạn muốn truy cập nó từ bên ngoài mô-đun, bạn có thể xác định hàm trả về giá trị của nó: 'def my_favorite_number, do: @ my_favorite_number' – AbM
đó là phương thức getter, nếu chúng ta có phím tắt để thực hiện điều này, ví dụ: attr_reader: my_favorite_number –