Arquivo

Textos com Etiquetas ‘Returning’

Use o método tap ao invés de returning

4 de outubro de 2010

Há um tempo atrás eu falei neste post sobre o método returning em Ruby on Rails e como ele facilita a criação de uma variável já atribuindo valores a ela.

A partir da versão 2.3.9 do Ruby on Rails, o método returning da classe Object se tornou obsoleto. Seu uso irá gerar um alerta informando para usar o método tap, nativo da classe Object no Ruby, no seu lugar:

DEPRECATION WARNING: Object#returning has been deprecated in favor of Object#tap.

O intuito dessa alerta é facilitar a migração de uma aplicação Rails 2.3.9 para a nova versão 3.0, já que nessa última versão do Rails o método returning foi removido.

Vamos ver os mesmos exemplos do post anterior, agora utilizando Object#tap.

Primeiro, um exemplo criando uma variável normalmente, atribuindo valores a ela e depois retornando-a como resultado de um método:

def some_values
  values = []
  values << "first element"
  values << "second element"
  values
end

some_values # => ["first element", "second element"]

E agora usando o método tap:

def some_values
  [].tap do |values|
    values << "first element"
    values << "second element"
  end
end

some_values # => ["first element", "second element"]

E um exemplo de um método auxiliar para testes de RSpec retirado de uma aplicação real:

def variants
  [].tap do |variants|
    5.times do |priority| do
      variants << Factory.build(:variant, :priority => priority)
    end
  end
end

Ruby , , , ,

Returning em Ruby on Rails

5 de agosto de 2010

Quantas vezes você já criou algum método em Ruby que inicializa uma variável, atribui valores a ela e depois a retorna?

Veja o exemplo abaixo:

def some_values
  values = []
  values << "first element"
  values << "second element"
  values
end

some_values # => ["first element", "second element"]

A linha 2 é cria um array vazio, depois são atribuidos valores nas linhas 3 e 4, e finalmente na linha 5 o array é retornado pelo método.

Em Ruby on Rails existe o método returning da classe Object que facilita nossa vida nesses casos:

def some_values
  returning values = [] do
    values << "first element"
    values << "second element"
  end
end

some_values # => ["first element", "second element"]

Na linha 2 chamamos o método returning passando a variável que será retornada já atribuindo seu valor inicial. Dentro do bloco, nas linhas 3 e 4, então atribuímos os valores ao array.

Há também esse outro tipo de sintaxe:

def some_values
  returning [] do |values|
    values << "first element"
    values << "second element"
  end
end

some_values # => ["first element", "second element"]

Funciona da mesma forma, mas acaba sendo não tão intuitivo como o código anterior.

Veja um trecho de código utilizando o método returning, de um método auxiliar para testes de RSpec retirado de uma aplicação real:

def variants
  returning variants = [] do
    5.times do |priority| do
      variants << Factory.build(:variant, :priority => priority)
    end
  end
end

E olhe só como é simples a implementação do método returning:

def returning(value)
  yield(value)
  value
end

Ruby , , ,