Kể từ Clojure 1.5, bạn cũng có thể sử dụng một trong các luồng luồng mới.
clojure.core/như->
([expr tên & hình thức])
Macro tên
liên kết với expr, đánh giá các hình thức đầu tiên trong bối cảnh từ vựng đó ràng buộc, sau đó liên kết tên với kết quả đó, lặp lại cho mỗi hình thức liên tiếp , trả về kết quả của biểu mẫu cuối cùng.
Đó là khá một cấu trúc mới, vì vậy không chắc chắn làm thế nào để sử dụng idiomatically nêu ra, nhưng tôi đoán một cái gì đó như thế này sẽ làm:
(as-> "test test test" s
(str/split s #" ")
(modification-1 s)
(modification-2 s)
...
(modification-n s)
(str/join "\n" s))
Sửa
Đối với lý do tại sao vị trí lý luận khác nhau, tôi không có chỗ để nói, nhưng tôi nghĩ rằng đề nghị của Arthur có ý nghĩa:
- Một số chức năng hoạt động rõ ràng trên các bộ sưu tập (
map
, reduce
, v.v ...). Chúng có xu hướng luôn lấy bộ sưu tập làm đối số cuối cùng, có nghĩa là chúng hoạt động tốt với ->>
- Một số chức năng không hoạt động trên bộ sưu tập và có xu hướng lấy đối số quan trọng nhất (là một điều?) tranh luận. Ví dụ: khi sử dụng
/
, chúng tôi dự kiến tử số sẽ đến trước. Các chức năng này hoạt động tốt nhất với ->
Vấn đề là - một số chức năng không rõ ràng. Họ có thể lấy một bộ sưu tập và tạo ra một giá trị duy nhất, hoặc lấy một giá trị duy nhất và tạo ra một bộ sưu tập. string\split
là một ví dụ (bỏ qua khoảnh khắc thêm nhầm lẫn rằng một chuỗi có thể được coi là cả một giá trị đơn hoặc một bộ sưu tập).Ghép/giảm hoạt động cũng sẽ làm điều đó - họ sẽ mess up đường ống của bạn!
Xem xét, ví dụ:
(->> (range 1 5)
(map inc)
(reduce +)
;; at this point we have a single value and might want to...
(- 4)
(/ 2))
;; but we're threading in the last position
;; and unless we're very careful, we'll misread this arithmetic
Trong những trường hợp này, tôi nghĩ rằng một cái gì đó giống như as->
là thực sự hữu ích.
Tôi nghĩ chung hướng dẫn sử dụng ->>
khi hoạt động trên bộ sưu tập và ->
nếu không là âm thanh - và chỉ trong những trường hợp biên giới/không rõ ràng này, as->
có thể làm cho mã trở nên rõ ràng hơn một chút.
Nguồn
2013-08-14 15:56:06
Điều gì là sai với? (tham gia "\ n" (chuỗi phân tách "\ s")) – Chiron
Tôi đã bỏ qua một vài chức năng sửa đổi ở giữa. Thêm chúng để làm rõ. – Profpatsch
Tại sao? 'clojure.string.join' phù hợp với các hàm khác có bộ sưu tập. '(map f col) (bộ lọc f col)' –