Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Qual é a diferença entre threading first e threading last?

Qual é a diferença entre threading first e threading last? Como escolher quando usar um ou outro?

1 resposta
solução!

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!