Pergunta

Eu tenho um método em um trilhos ajudante arquivo como este

def table_for(collection, *args)
 options = args.extract_options!
 ...
end

e eu quero ser capaz de chamar esse método como este

args = [:name, :description, :start_date, :end_date]
table_for(@things, args)

para que eu possa passar dinamicamente nos argumentos baseados em um formulário cometer. Eu não posso reescrever o método, porque eu usá-lo em muitos lugares, de que outra forma eu posso fazer isso?

Foi útil?

Solução

Rubi lida bem com vários argumentos.

Aqui está um exemplo muito bom.

def table_for(collection, *args)
  p collection: collection, args: args
end

table_for("one")
#=> {:collection=>"one", :args=>[]}

table_for("one", "two")
#=> {:collection=>"one", :args=>["two"]}

table_for "one", "two", "three"
#=> {:collection=>"one", :args=>["two", "three"]}

table_for("one", "two", "three")
#=> {:collection=>"one", :args=>["two", "three"]}

table_for("one", ["two", "three"])
#=> {:collection=>"one", :args=>[["two", "three"]]}

(reduzir a produção e colado de IRB)

Outras dicas

Apenas chamá-lo desta maneira:

table_for(@things, *args)

A (splat) operador * irá fazer o trabalho, sem ter que modificar o método.

class Hello
  $i=0
  def read(*test)
    $tmp=test.length
    $tmp=$tmp-1
    while($i<=$tmp)
      puts "welcome #{test[$i]}"
      $i=$i+1
    end
  end
end

p Hello.new.read('johny','vasu','shukkoor')
# => welcome johny
# => welcome vasu
# => welcome shukkoor
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top