(defn hello
[& {:keys [person]
:or {person "Rich"}}]
(str "Hello, " person))
(hello) => "Hello, Rich"
(hello :person "Hickey") => "Hello, Hickey"
Eu esperava (hello :person nil)
ter o mesmo resultado que chamar (hello)
, mas, ao que parece, Clojure parece fazer uma distinção entre nada e nil
quando se trata de desestruturação.
Uma situação do mundo real em que isso poderia ocorrer seria quando você, por exemplo, dependesse do resultado de uma operação de desestruturação para fornecer parâmetros para uma função semelhante a hello
. por exemplo
(defn spam
[& {:keys [person]}]
(str (hello :person person)
"Give me all your money."))
Chamar (spam)
resultaria em (hello :person nil)
, o que teria o – provavelmente – efeito indesejado de retornar "Hello, "
. Você pode optar por adicionar um :or
ao desestruturar o argumento para spam, mas então o mesmo código aparecerá duas vezes. Uma solução mais localizada seria mudar a hello
definição para algo assim.
(defn hello
[& {:keys [person]}]
(str "Hello, " (or person "Rich")))
Isso funcionou no meu caso, mas adoraria ouvir sobre abordagens mais idiomáticas.