Как указать возможность двух типов для переменной?Clojure: подсказки нескольких типов?
(defn connect! [(or ^:String :^java.net.InetAddress) host ^:Integer port] ...)
Спасибо!
Как указать возможность двух типов для переменной?Clojure: подсказки нескольких типов?
(defn connect! [(or ^:String :^java.net.InetAddress) host ^:Integer port] ...)
Спасибо!
Clojure поддерживает использование типа подсказок, чтобы помочь компилятору избежать отражения в производительности критически важных областях кода. Как правило, следует избегать использования типов подсказок до тех пор, пока не появится известное узкое место производительности.
Назначение типов подсказок - дать возможность компилятору избежать отражения. Любые аспекты самодокументации типа-намеченного кода являются вторичными. Когда вы говорите следующее:
(defn connect! [^String host])
Что вы говорите, компилятор должен решить все метод Interop Java призывает host
во время компиляции метод вызывает на String
класса. Предоставление формы, которая будет намекаться на несколько классов, победит эту цель - компилятор не знает, какой класс компилирует вызов метода как. Даже если бы это было так, объект не может быть String
и InetAddress
одновременно, поэтому любые вызовы методов, скомпилированные по классу String
, будут сбой с ClassCastException
, если произошел переход InetAddress
, и наоборот.
Я имел в виду самостоятельную документацию, но да, я полагаю, что это может быть достигнуто с помощью строки документа. Благодарю. – leontalbot
@leontalbot Если вы еще этого не сделали, взгляните на [Призматическая схема] (https://github.com/Prismatic/schema) для самодокументированных определений функций с поддержкой объединений и проверки времени выполнения. – Alex
Насколько я знаю, единственный способ это сделать сами проверить и добавить подсказку в позволении:
(condp instance? host
String (let [^String s] (...))
InetAddress (let [^InetAddress a] (...)))
Это будет работать, но я бы рассматривал это как своего рода запах кода - он попросил рефакторинга использовать протокол или мультиметод. – Alex
Почему вы хотите это сделать? Цель тит-намека - дать возможность компилятору избежать отражения. Предоставление формы форме намечено, так как два разных класса могут победить эту цель. – Alex