но теперь не завершены, и вызов новой функции с таким типом приведет к
ге "Радость Clojure",defprotocol
предлагается в качестве решения дляпроблема выражения - «желание реализовать существующий набор абстрактных методов для существующего конкретного класса без необходимости изменения кода, который определяет либо».
Пример приведен ниже:
(defprotocol Concatenatable
(cat [this other]))
(extend-type String
Concatenatable
(cat [this other]
(.concat this other)))
(cat "House" " of Leaves")
;=> "House of Leaves"
(extend-type java.util.List
Concatenatable
(cat [this other]
(concat this other)))
(cat [1 2 3] [4 5 6])
;=> (1 2 3 4 5 6)
Предполагается, что это невозможно на языке, подобном Java, но чем он отличается от следующего?
public class Util {
public static String cat(final String first,
final String second) {
return first.concat(second);
}
public static <T> List<T> cat(final List<T> first,
final List<T> second) {
final List<T> list = new List<T>(first);
list.addAll(second);
return list;
}
}
Ведь оба используются одинаково:
(cat "House" " of Leaves")
Util.cat("House", " of Leaves");
Функция Clojurecat
являетсяне a метод наString
а такжеList
классы, а скорее независимыйфункция перегружен, чтобы принять либоString
или жеList
аргументы.
Хотя мне действительно нравится Clojure, я не понимаю претензий на превосходство этой конструкции.