Fernando Luizão

Desenvolvimento de software e nerdices em geral

Dica: define_method com parâmetros opcionais

leave a comment »

Quando estamos definindo um método com define_method, passamos os parâmetros nas variáveis do bloco, por exemplo:

class Teste
  define_method "meu_metodo" do |foo, bar|
    puts "foo: #{foo}, bar: #{bar}"
  end
end

t = Teste.new
t.meu_metodo "param1", "param2"
#foo: param1, bar: param2

Porém, se tentarmos definir um parâmetro opcional (com valor default), da forma que estamos acostumados, temos um erro de sintaxe:

define_method "meu_metodo" do |foo, bar, options = {}|
#syntax error, unexpected tSTRING_BEG, expecting kDO or '{' or '('

Para contornar isso, podemos utilizar o splat (*), para colocar os parâmetros opcionais em um array:

class Teste
  define_method "meu_metodo" do |foo, bar, *options|
    #se o parametro opcional não for passado, inicializamos com um hash vazio
    options = options.first || {} 
    puts "foo: #{foo}, bar: #{bar}"
    puts options.inspect
  end
end

t = Teste.new
t.meu_metodo "param1", "param2", :foo => "foo", :bar => "bar"
#foo: param1, bar: param2
#{:bar=>"bar", :foo=>"foo"}
t.meu_metodo "primeiro", "segundo" 
#foo: primeiro, bar: segundo
#{}

Dessa forma podemos passar quantos parâmetros opcionais quisermos :).

Advertisements

Written by fernandoluizao

February 11, 2009 at 9:26 pm

Posted in Ruby

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: