2015-09-09 14 views
6

Tôi đang cố gắng viết một tập các macro tất cả sẽ phải phụ thuộc vào kiến ​​thức về cùng một mô-đun và do đó, tôi cố gắng tránh bỏ qua mô-đun này một cách rõ ràng cho từng hàm (tôi thực sự ổn khi làm vì vậy, nhưng khi tôi đang học ngôn ngữ tôi đang cố gắng khám phá tất cả các khả năng!).Có thể truy cập động mô-đun bằng chuỗi hoặc ký hiệu không?

Vì vậy, tôi đang viết (Mục đích là để truy cập SomeOtherModule, hoặc gọi SomeOtherModule.foo bên trong tạo ra foo chức năng.)

defmodule MacrosUser do 
    use MyMacros, SomeOtherModule 
end 

defmodule MyMacros do 
    defmacro __using__(opts) do 
    {:__aliases__, _, module_path} = opts 
    quote do 
     def foo do 
     module_path 
     |> Enum.join(".") 
     |> apply(:foo, []) 
     end 
    end 
    end 
end 

Nhưng điều này rõ ràng là không hoạt động như mong đợi apply/3 một mô-đun và không phải là một chuỗi hoặc biểu diễn biểu tượng tên của mô-đun.

Về cơ bản, như tiêu đề cho biết, tôi đang tìm cách để tạo chuỗi sao cho chuỗi hoặc biểu tượng cho trước sẽ truy cập vào mô-đun tương ứng hoặc gọi hàm của mô-đun đó.

Ngoài ra, tôi biết rằng có thể truy cập mô-đun hiện tại qua __MODULE__ trong macro, nhưng tôi đang tìm cách truy cập bất kỳ mô-đun hiện tại nào, không chỉ mô-đun hiện tại.

+0

Khi nằm trong ngữ cảnh 'MyMacros',' __MODULE__ == MyMacros ==: "Elixir.MyMacros" '. –

+0

Vâng, tôi biết. Trong ví dụ này, tôi đang tìm cách truy cập 'SomeOtherModule' được chuyển tới hook' __using__'. Tôi có lẽ nên cập nhật câu hỏi. – user2205259

Trả lời

11

Sử dụng Module.concat(module_path) thay vì tự tham gia đường dẫn vì mục đích này là dành cho mục đích này.

+3

Câu trả lời hoàn hảo. Cũng đáng giá thêm tuyên bố từ chối trách nhiệm mà các nhà phát triển nên tránh phương pháp này khi có thể vì Elixir ủng hộ rõ ràng hơn về tiềm ẩn. Hơn nữa, cách tiếp cận này có thể không an toàn trong nhiều trường hợp, phương pháp đầu tiên là nguyên tử và tên mô-đun là rác được thu thập. –

Các vấn đề liên quan