2015-03-18 3 views
0

Как указать возможность двух типов для переменной?Clojure: подсказки нескольких типов?

(defn connect! [(or ^:String :^java.net.InetAddress) host ^:Integer port] ...) 

Спасибо!

+2

Почему вы хотите это сделать? Цель тит-намека - дать возможность компилятору избежать отражения. Предоставление формы форме намечено, так как два разных класса могут победить эту цель. – Alex

ответ

2

От Clojure documentation:

Clojure поддерживает использование типа подсказок, чтобы помочь компилятору избежать отражения в производительности критически важных областях кода. Как правило, следует избегать использования типов подсказок до тех пор, пока не появится известное узкое место производительности.

Назначение типов подсказок - дать возможность компилятору избежать отражения. Любые аспекты самодокументации типа-намеченного кода являются вторичными. Когда вы говорите следующее:

(defn connect! [^String host]) 

Что вы говорите, компилятор должен решить все метод Interop Java призывает host во время компиляции метод вызывает на String класса. Предоставление формы, которая будет намекаться на несколько классов, победит эту цель - компилятор не знает, какой класс компилирует вызов метода как. Даже если бы это было так, объект не может быть String и InetAddress одновременно, поэтому любые вызовы методов, скомпилированные по классу String, будут сбой с ClassCastException, если произошел переход InetAddress, и наоборот.

+0

Я имел в виду самостоятельную документацию, но да, я полагаю, что это может быть достигнуто с помощью строки документа. Благодарю. – leontalbot

+1

@leontalbot Если вы еще этого не сделали, взгляните на [Призматическая схема] (https://github.com/Prismatic/schema) для самодокументированных определений функций с поддержкой объединений и проверки времени выполнения. – Alex

1

Насколько я знаю, единственный способ это сделать сами проверить и добавить подсказку в позволении:

(condp instance? host 
    String (let [^String s] (...)) 
    InetAddress (let [^InetAddress a] (...))) 
+0

Это будет работать, но я бы рассматривал это как своего рода запах кода - он попросил рефакторинга использовать протокол или мультиметод. – Alex

Смежные вопросы