72 votes

Comment passer plusieurs arguments à une méthode ruby sous forme de tableau ?

J'ai une méthode dans un fichier d'aide de rails comme ceci

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

et je veux pouvoir appeler cette méthode comme ceci

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

afin de pouvoir transmettre dynamiquement les arguments en fonction de la validation d'un formulaire. Je ne peux pas réécrire la méthode, car je l'utilise à trop d'endroits, comment puis-je faire autrement ?

100voto

sean lynch Points 926

Ruby gère bien les arguments multiples.

Voici un très bon exemple.

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"]]}

(Sortie coupée et collée de l'irb)

69voto

Maximiliano Guzman Points 1337

Appelez ça comme ça :

table_for(@things, *args)

El splat ( * ) fera l'affaire, sans avoir à modifier la méthode.

0voto

Anoob K Bava Points 323
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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X