Qual é a diferença entre threading first e threading last? Como escolher quando usar um ou outro?
Qual é a diferença entre threading first e threading last? Como escolher quando usar um ou outro?
Olá Solange, como vai?
Encontrei este Gist (em inglês) que explica muito bem quando usar um modo ou outro.
Em casos que só é chamado o encadeamento de funções, tanto faz usar um ou outro como no exemplo que foi retirado deste Gist:
(defn factorial-seq [n]
( ->> (inc n)
(range)
(next)))
(factorial-seq 5) // (1 2 3 4 5)
ou
(defn factorial-seq [n]
( -> (inc n)
(range)
(next)))
(factorial-seq 5) // (1 2 3 4 5)
Nestes casos não tem diferença, afinal estamos apenas chamando uma função após a outra.
Agora se incluirmos a função reduce
conseguimos encontrar quando usar uma ou outra forma:
(defn factorial [n]
( ->> (inc n)
(range)
(next)
(reduce *))) ;; reduce them by multiplying
(factorial 5) ;; 120
Neste caso funciona, pois a sintaxe do reduce
é (reduce <função> [argumento])
, então o thread last irá passar o argumento depois da operação *
. Já o thread first dará erro, pois passará o argumento antes da função e neste caso invertendo qual será o valor da operação e qual será o argumento passado pelas outras funções.
Resumindo: Quando precisar de (nome-da-função [argumento] <função-de-entrada>)
deve usar thread first ->
. Quando precisar de (nome-da-função <função-de-entrada> [argumento])
deve usar thread last ->>
.
Espero ter ajudado!