2015-07-11 24 views
5

Giả sử tôi tạo một Mailbox bằng cách sử dụng mailbox = Signal.mailbox Action, trong đó type Action = Blah, sau đó tôi có thể gửi các hành động này mailbox bằng cách sử dụng Signal.send mailbox.address Blah, điều này cho phép tôi nghe theo số mailbox.signal, như thế nào? Ý tôi là, sau tất cả, gõ Mailbox chỉ là một bí danh của {address : Signal.Address Action, signal : Signal.Signal Action}, là bởi vì, trong elm, chỉ có một tín hiệu cho một kiểu nhất định, vì vậy trong kịch bản trên, tôi không phải nói với elm để ràng buộc mailbox.signal với mailbox.address, elm sẽ tự tìm ra vì sự tương ứng một-một giữa địa chỉ và tín hiệu của một loại nhất định?Elm: Mailbox hoạt động như thế nào?

Trả lời

6

Khả năng hộp thư đặt sự kiện bạn gửi cho nó vào tín hiệu của nó hoàn toàn dựa trên "ma thuật", nghĩa là nó được thực thi nguyên bản (bằng JavaScript) chứ không phải thứ bạn có thể tự thực hiện. Đó là lý do tại sao nó được tích hợp sẵn trong các thư viện chuẩn.

Tạo hộp thư là hành động bắt buộc, có hiệu lực (shhh, đừng nói cho ai biết). Vì vậy, nếu bạn sử dụng:

mailbox1 = Signal.mailbox Blah 
mailbox2 = Signal.mailbox Blah 

hai hộp thư đó sẽ khác biệt. Gửi tin nhắn đến mailbox2.address sẽ dẫn đến thông báo trên mailbox2.signal nhưng không phải là mailbox1.signal. Điều này phá vỡ tính minh bạch tham chiếu, điều đó là xấu, nhưng bây giờ nó không phá vỡ mọi thứ. (Điều này có thể đi quá xa vào một ốp, nhưng bởi vì bạn cần Signal cho đầu ra và không thể có Signal (Signal something), trong thực tế hiệu quả không được quản lý của việc tạo hộp thư không phải là điều rối tung lên). Điều này "rò rỉ" sẽ được cố định tại một số điểm trong tương lai. Đã có một đề xuất nhưng những thay đổi lớn được tổ chức theo các phiên bản khác nhau của ngôn ngữ.

+2

Nếu gọi 'Signal.mailbox' hai lần tạo hai hộp thư khác nhau, làm thế nào để mã trong hướng dẫn [Giao tiếp với hộp thư] (http://elm-lang.org/guide/reactivity), tức là' Signal.send contentMailbox. địa chỉ "hello!" 'làm việc? Vì 'contentMailbox' được gọi là lần thứ hai ở đó, nên tạo một tín hiệu khác không phải là tín hiệu được sử dụng trong' main = Signal.map show contentMailbox.signal' nơi nó được gọi là lần đầu tiên và do đó _ "hello" _ nên không xuất hiện? – RAbraham

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