2016-02-17 16 views
5

Tôi có đoạn code sau trong elixir:Làm thế nào để tạo ra một biến toàn cầu trong elixir Mô-đun

def get_trackerid(imei) do 
    client = get_new_client() 
    {:ok, result} = :cqerl.run_query(client, "SELECT * FROM trackers_by_imei where imei = \'#{imei}\';") 
    row = :cqerl.all_rows(result) 
end 

Bây giờ, bây giờ nhiều chức năng được gọi hàm get_trackerid và mọi hàm được gọi, một cuộc gọi đến cơ sở dữ liệu được thực hiện.

Có cách nào để viết một hàm trong elixir như vậy kết quả được lưu trữ trong biến cục bộ hay không. Vì vậy, khi trackerid tiếp theo cho cùng một imei được yêu cầu, tôi có thể lấy dữ liệu từ biến cục bộ.

Tôi nghĩ rằng không có khái niệm về biến toàn cầu trong elixir, do đó, đó không phải là một lựa chọn, phải không?

Trả lời

4

Bạn có một vài tùy chọn để lưu trạng thái trong Elixir.

Nếu phương pháp này là một phần của mô-đun đang chạy GenServer, thì bạn có thể sử dụng tham số state cho giá trị bộ nhớ cache.

Bạn cũng có thể sử dụng ets table để lưu các giá trị. Điều này sẽ làm việc cả bên trong và bên ngoài một GenServer.

5

Những gì bạn đang hỏi về được gọi là "memoization". Tôi đề cập rằng nếu bạn quan tâm đến Google và xem liệu bạn có thể tìm thêm về chủ đề này không.

Đây là một bài viết trên blog lớn thảo luận về một kỹ thuật memoization trong Elixir: https://web.archive.org/web/20161116091132/http://ineverfinishanyth.in/2014/01/20/memoization-in-elixir

TL; DR

Xây dựng một bộ nhớ cache và kiểm tra bộ nhớ cache khi bạn cố gắng làm tính của bạn để xem nếu câu trả lời đã có. Trong trường hợp bài đăng trên blog đó, anh xây dựng kho khóa-giá trị dưới dạng bộ nhớ cache nhưng rõ ràng loại bộ nhớ cache bạn nên tạo sẽ phụ thuộc nhiều vào dữ liệu bạn đang lưu vào bộ nhớ cache.

+0

Liên kết được cung cấp bị hỏng. – tuned

+1

@tunedconsulting Tôi đã thay đổi liên kết để trỏ đến phiên bản bộ nhớ cache của trang web. –

+1

liên kết mới có tại đây http://ineverfinishanyth.in/2014/01/20/memoization-in-elixir (: – tuned

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