Tôi muốn biết tại sao defmulti & defmethod được sử dụng? Ưu điểm là gì? Và bạn sử dụng nó như thế nào? Vui lòng giải thích những gì đang xảy ra trong mã.làm thế nào và tại sao defmulti và defmethod được sử dụng? và những lợi thế là gì?
Trả lời
Trong "một cách chung chung" bạn sẽ gọi nó là một if/else trên steroid và trong "gây ấn tượng với tôi" phong cách bạn sẽ đặt tên cho nó với "cử động", "thời gian chạy đa hình" vv
Cho phép nói rằng bạn muốn để xác định một chức năng "Add" mà nên làm việc cho các loại dữ liệu khác nhau như trong trường hợp Int nó nên thêm các con số, trong trường hợp của chuỗi nó nên concat các chuỗi. Bây giờ nó là rất đơn giản để thực hiện nó bằng cách sử dụng nếu khác, về cơ bản bạn kiểm tra các loại đối số và nếu họ là số nguyên sau đó thêm chúng, nếu họ là chuỗi sau đó concat họ khác ném ngoại lệ. Nhưng vấn đề với điều này là trong trường hợp bạn muốn thêm hỗ trợ cho kiểu dữ liệu mới trong hàm Add của bạn, bạn cần phải sửa đổi chức năng Thêm, có thể không thực hiện được trong trường hợp bạn không kiểm soát nguồn Thêm chẳng hạn như trường hợp nó được định nghĩa trong một số thư viện, vv defmulti
và defmethod
cho phép bạn giải quyết vấn đề này tức là thêm trường hợp mới vào hàm hiện có mà không sửa đổi mã của nó.
(defmulti add (fn [a b] [(type a) (type b)]))
add là tên hàm, hàm nặc danh là bạn if/else, về cơ bản này sẽ được gọi trên đối số add bạn và giá trị trả về của hàm này sẽ được kiểm tra nếu có bất kỳ thực hiện. Bây giờ hãy thực hiện nó cho Integer.
(defmethod add [Integer Integer] ([a b] (+ a b)))
[Integer Integer]
được loại chuyển trường hợp trên giá trị trả về của hàm nặc danh chúng tôi quy định tại defmulti
và sau đó thực hiện.
Tương tự như vậy chúng ta có thể làm cho các chuỗi
(defmethod add [String String] ([a b] (str a b)))
Gọi nó với số nguyên (add (int 1) (int 2))
Gọi nó với chuỗi (add "hello" "world")
Gọi nó với cái gì đó không phù hợp với chúng tôi nếu/else tức là không thực hiện được cho một trường hợp sẽ dẫn đến một ngoại lệ
Cảm ơn bạn rất nhiều! Điều này là rất hữu ích! – Phil
Cảm ơn bạn đã giải thích! – goncalvesnelson
Từ những gì tôi đã quan sát thấy sau khi đọc câu trả lời (và sử dụng các ví dụ được cung cấp ở trên), sau đây cũng là hữu ích để hiểu:
khi bạn thực hiện lệnh:
(add (int 5) (int 2))
gì xảy ra là rằng 'thêm defmulti' như vậy được thực hiện sản xuất một danh sách:
[Integer Integer]
với điều đó được sản xuất, có vẻ đối với bất kỳ 'thêm defmethod' được xác định với danh sách ví dụ trên:
(add [Integer Integer])
Và chuyển các đối số mà nó nhận được.
Một cách khác để xác định các phương pháp đa để làm việc thông qua các đối số rõ ràng là:
(defmulti add (fn [a b] [(type a) (type b)]))
(defmethod add [Integer Integer] [a b] (+ a b))
(defmethod add [String String] [a b] (str a b))
Sau đó chạy các chức năng như:
(add 12 73)
hoặc
(add "thank" "you")
- 1. Những lợi thế khi sử dụng Qt là gì?
- 2. những lợi thế khi sử dụng scrapyd là gì?
- 3. những lợi thế và bất lợi của việc thực hiện cuộc gọi ajax bằng cách sử dụng jquery là gì?
- 4. .inc là gì và tại sao sử dụng?
- 5. Yếu tố el/là gì? Làm thế nào để tôi sử dụng nó? Và tại sao?
- 6. GenericParameterHelper là gì và được sử dụng như thế nào?
- 7. Java: những thuận lợi và sử dụng FilterInputStream là gì so với các dòng khác
- 8. Tại sao C# và VB có Generics? Họ cung cấp những lợi ích gì? Generics, FTW
- 9. Thế nào là | và^toán tử được sử dụng cho?
- 10. Repo là gì và tại sao Google sử dụng?
- 11. lợi thế của việc sử dụng giao diện là gì
- 12. Định tuyến phía máy khách là gì và được sử dụng như thế nào?
- 13. Tại sao chúng ta cần, những lợi thế để sử dụng mongoose
- 14. Cây biểu thức là gì, bạn sử dụng chúng như thế nào và tại sao bạn sử dụng chúng?
- 15. Asm ("pause") làm gì và tại sao sử dụng nó
- 16. Phương pháp Javascript CollectGarbage() là gì? Khi nào và tại sao nó nên được sử dụng?
- 17. lợi thế, bất lợi và khó khăn khi viết một ngôn ngữ để sử dụng .NET
- 18. Làm thế nào để sử dụng LINQ và tại khoản
- 19. io_service, tại sao và nó được sử dụng như thế nào?
- 20. xUnit hoặc NUnit? Những lợi thế và bất lợi của nhau?
- 21. Có lợi thế nào khi sử dụng AND và OR trên && và || trong PHP?
- 22. Func là gì, như thế nào và khi nào nó được sử dụng
- 23. CMS hướng sự kiện - lợi thế và bất lợi
- 24. Chú thích vs XML, lợi thế và bất lợi
- 25. Những lợi thế của việc sử dụng XSL trong Sitecore thay vì C# là gì?
- 26. Ngoại lệ trong PHP là gì và những gì là thử và bắt?
- 27. node.js - những lợi thế của việc sử dụng ngọc bích
- 28. Tại sao các lớp học có thể được sử dụng làm thông số kiểu và những gì cho?
- 29. segfault rip/số RSP và là gì làm thế nào để sử dụng chúng
- 30. Biểu tượng SQL # có nghĩa là gì và nó được sử dụng như thế nào?
Are bạn có thể định nghĩa multimethod là gì? Nếu không thì tôi sẽ vui lòng giải thích cho bạn – tgoossens
Đây là câu hỏi mà tôi từng hỏi: http://cs.stackexchange.com/questions/4660/difference-between-multimethods-and-overloading Tôi đã trả lời câu hỏi của riêng mình Đồng thời, điều này có thể giúp bạn hiểu được đa phương thức là gì – tgoossens