Articles

Injetar Método: Explicou

Hoje, estamos dando uma olhada em Ruby injetar método (#injetar). Como qualquer um que está longe o suficiente ao longo de sua jornada para aprender mais sobre codificação, você sabe que as línguas estão cheias de métodos e funções confusas, incríveis. Recentemente, deparei-me com uma destas confusas, e como aprendi, métodos incríveis, injetam. Eu estava tentando somar um conjunto de inteiros e erroneamente pensei que ruby tinha um método native #sum, mas não tinha essa sorte. Então, eu tenho que pesquisar e encontrar # injecte.

O método # injecte actua do mesmo modo que o método #reduce, e são considerados pseudónimos. Estes métodos enumeradores podem ter uma gama ou uma matriz de Números, e podem, opcionalmente, receber um bloco. Quando chamado, o método de injecção passará por cada elemento e acumular-se-á sequencialmente.

.inject(:+) => (((3 + 6) + 10) + 13) => 32

ou

.inject {|sum, number| sum + number} =>|3, 6| 3 + 6 => 9
=>|9, 10| 9 + 10 =>19

para o decompor ainda mais, injecte toma o primeiro elemento da sua colecção e usa-o como a ‘soma’de base. Ele então pega o próximo elemento (ou o segundo elemento na matriz) e, em seguida, adiciona-os juntos. O método então atribui esse resultado à “soma” e adiciona no próximo elemento da coleção até que todos os elementos tenham sido passados através do bloco. Neste caso, “soma” é o que chamamos de acumulador — pois está acumulando os valores. O valor de retorno será a soma de todos os elementos da coleção.

este método é curioso porque você também pode passar – lhe um valor padrão para o acumulador. Veja abaixo:

.inject(0, :+) => 32.inject(0) {|sum, number| sum + number} => 19

Aqui, você está dando o método de um valor inicial para o acumulador, desde que eu passei a zero, o método irá adicionar o primeiro elemento da coleção para zero antes de se passar à adição do segundo e terceiro elementos na coleção.

Agora que sabemos como adicionar valores a partir de coleções… Vamos explorar as outras aplicações do #injetar.

Hashes de construção:

#a injecção pode ser muito poderosa fora da adição de valores juntos. Vamos dizer que você tem dados ou um valor de retorno que é um array de arrays que contêm chaves e valores (i.e. , ]). Você provavelmente vai querer que essas sejam chaves: pares de valores em um hash. A injecção pode ser feita muito rápida e elegantemente.

, ].inject({}) do |result, element| 
result = element.last
result
end
#=> {:student=>"Terrance Koar", :course=>"Web Dev"}

neste exemplo começamos com um conjunto de matrizes contendo pares de chaves e valores. Quando chamamos injetar e passar em um argumento de um hash vazio, que irá atuar como o acumulador (ou, neste caso, ‘resultado’). Em seguida, o método itera através de cada elemento e injeta-o no hash usando o bloco fornecido. O bloco está atribuindo o elemento chave, que comest primeiro, como uma chave no novo hash e definindo o valor igual ao segundo elemento no array aninhado. Outra coisa a notar aqui é que o valor de retorno da injeção é o próximo resultado obtido (tipicamente a soma de inteiros). Uma vez que queremos o nosso hash, temos de devolver explicitamente o hash do “resultado”.

adicionalmente, o injecte pode ser usado para converter tipos de dados com a ajuda de alguns outros métodos fixes — mesmo enquanto está a construir um novo hash!

, ].inject({}) do |result, element| 
result = element.last.upcase
result
end
# => {"student"=>"TERRANCE KOAR", "course"=>"WEB DEV"}OR, ].inject({}) do |result, element|
result = element.last.split
result
end# => {"student"=>, "course"=>}

Injecte não pára aí. Ele também pode filtrar e construir um novo array!

.inject() do |result, element| 
result << element.to_s if element > 9
result
end# =>

Aqui estamos passando injetar um valor inicial de uma matriz vazia. O primeiro elemento entre o | / será sempre o “resultado” ou acumulador no bloco. Assim, uma vez que o resultado é igual a uma matriz vazia, podemos escavar em qualquer elemento que passa nosso filtro, neste caso se o elemento for maior que 9. Mais uma vez, uma vez que o valor de retorno do injecte é o próximo resultado obtido, precisamos retornar explicitamente o resultado.