Tôi có một dòng suối lười đến từ một tệp mà tôi đang đọc với tail-seq (để đóng góp - bây giờ!) Và tôi muốn xử lý các dòng sau một với một vài "hàm listener" hành động tùy thuộc vào lần truy cập lại (hoặc những thứ khác) trong các dòng.Một đối số, nhiều chức năng
tôi thử như sau:
(defn info-listener [logstr]
(if (re-seq #"INFO" logstr) (println "Got an INFO-statement")))
(defn debug-listener [logstr]
(if (re-seq #"DEBUG" logstr) (println "Got a DEBUG-statement")))
(doseq [line (tail-seq "/var/log/any/java.log")]
(do (info-listener logstr)
(debug-listener logstr)))
và nó hoạt động như mong đợi. Tuy nhiên, có rất nhiều mã trùng lặp và các lỗi khác trong mã, và nó nhàm chán để cập nhật mã.
Một bước quan trọng có vẻ là để áp dụng nhiều chức năng để một đối số, tức là
(listen-line line '(info-listener debug-listener))
và sử dụng rằng thay vì nhàm chán và dễ bị lỗi do-tuyên bố.
Tôi đã thử các cách tiếp cận thông minh dường như sau:
(defn listen-line [logstr listener-collection]
(map #(% logstr) listener-collection))
nhưng điều này chỉ làm cho
(nil) (nil)
có chức năng lớp lazyiness hoặc đầu tiên cắn tôi chắc chắn, nhưng nơi nào tôi đặt ứng dụng?
Tôi cũng mở ra một cách tiếp cận hoàn toàn khác cho vấn đề, nhưng điều này có vẻ là một cách khá lành mạnh để bắt đầu. Macro/đa phương pháp có vẻ là quá mức/sai cho đến bây giờ.
Điều này rất thanh lịch và cũng đã cho tôi những hiểu biết sâu sắc hơn về Clojure (giống như câu trả lời ở trên). Cảm ơn, Alex! – claj
@claj bạn rất tử tế. Nếu bạn muốn lấy mức độ trừu tượng hơn nữa bạn thực hiện một thay đổi nhỏ và có đối số thứ hai cho người nghe chính nó là một hàm được gọi với logstr. Điều đó cho phép các hành động khác nhau dựa trên kết hợp đầu vào. Vào thời điểm đó, chúng tôi đã cơ bản tái tạo một đa phương thức. Các hàm như các thực thể lớp đầu tiên cho phép trừu tượng hóa mạnh mẽ! –