Ruby find_all vs select, qual é o acordo?

A um mês atrás eu não sabia absolutamente nada sobre a linguagem de programação Ruby. Eu tinha acabado de ser entrevistado usando Javascript para a Flatiron School onde ensinam tanto Javascript como Ruby. Rápido até agora não consigo me fartar!

A aceitação na Flatiron School foi apenas o começo. Cem horas de pré-trabalho em Ruby seguiram-se rapidamente onde aprendemos toneladas de métodos Ruby que precisaríamos para construir aplicações funcionais.

Destes métodos em Ruby, find_all e select destacaram-se para mim porque pareciam ter conseguido a mesma coisa. A pesquisa inicial levou-me a encontrar…

>

>

>>

>

>

>

>>
>>>

>

>

>

>>

>>

>

>

>

>

>seleccionar
>

>

Espera, não são idênticos!?

Bem, mais ou menos. Um mergulho mais profundo nos documentos Ruby levou-me a descobrir que existe um pouco mais debaixo do capô.

Um objecto é enumerável se descrever um conjunto de itens e um método para passar por cima de cada um deles. Em Ruby, Enumerable#find_all e Enumerable#select são o mesmo código. Os Arrays em Ruby herdam de Enumerable, portanto correr find_all ou seleccionar num Array em Ruby irá produzir o mesmo resultado.

MAS começa a ficar complicado quando se está a fazer um loop sobre um hash. Um hash é uma colecção de pares de valores chave. Se está mais familiarizado com Javascript, um hash em Ruby é como um objecto em Javascript.

** Num hash, find_all retorna um array**

hash = {a: 1, b: 2, c: 3, d: 4}hash.find_all do |key, value|
value.odd?
end#would return , ] because the find_all method is #inherited from Enumerable

** Num hash, select retorna um hash em vez de um array**

hash = {a: 1, b: 2, c: 3, d: 4}hash.select do |key, value|
value.odd?
end#would return {a:1, c:3}

Então porque é que find_all e select produzem resultados diferentes quando correm num hash? Com um Hash, find_all ainda herda de Enumerable mas select é redefinido para retornar um Hash ao invés de um Array. Diferença sutil mas importante!

Moral da história, pense sobre o que você quer retornar ao usar select ou find_all (e realmente qualquer método em engenharia de software) antes de usá-lo!

Yay, nós fizemos isso!

Deixe uma resposta

O seu endereço de email não será publicado.