Array, conversion

Array, conversion - Ruby/Rails - Programmation

Marsh Posté le 14-10-2013 à 12:39:25    

Salut,
comment je peux faire pour m'assurer qu'un argument donné à une méthode soit toujours un Array.

Code :
  1. def test(arg)
  2.   arg = [arg] if !arg.is_a?(Array)
  3. end

Il y a pas une astuce plus simple? comme convertir sans rajouter de doubles accolades (un Array qui en contien un autre).


Message édité par Profil supprimé le 14-10-2013 à 12:40:08
Reply

Marsh Posté le 14-10-2013 à 12:39:25   

Reply

Marsh Posté le 14-10-2013 à 13:04:21    

Pourquoi tu veux t'assurer que cet argument est toujours un array?


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 14-10-2013 à 13:40:24    

J'ai une méthode avec un argument optionnel, par defaut cet argument est un array vide.
Je veux pouvoir appeler cette méthode avec un Array de plusieurs éléments (comprenant uniquement des chaînes)
Ou bien appeler cette méthode avec une seule chaîne pour qu'au final ce soit un array d'un seul élément.  
C'est juste pour simplifier l'appel dans le cas d'un seul élément.

Message cité 1 fois
Message édité par Profil supprimé le 14-10-2013 à 13:45:12
Reply

Marsh Posté le 14-10-2013 à 13:46:10    


Splat argument:

Code :
  1. > def test(*args)
  2. >   puts args
  3. > end
  4. > test()
  5. > test(1)
  6. 1
  7. > test(1, 2)
  8. 1
  9. 2
  10. > test(1, 2, 3, 4, 5)
  11. 1
  12. 2
  13. 3
  14. 4
  15. 5
  16. > a = [1, 2, 3]
  17. > test(*a)
  18. 1
  19. 2
  20. 3


Message édité par masklinn le 14-10-2013 à 13:49:01

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 14-10-2013 à 14:20:33    

Ouai je vois mais en fait c'est plus compliqué que ça, j'ai plusieurs arguments de méthode.
Un requis, deux optionnels.
 
D'ailleurs j'en profite pour te demander, il vaut mieux définir la méthode comme ça.

Code :
  1. def meth(arg1, opt1=[], opt2=false)
  2. end


ou

Code :
  1. def meth(arg1, opt1: [], opt2: false)
  2. end


Ce que j'ai compris, c'est que la deuxième façon de faire, je dois appeler la méthode avec opt1: value
 
Ce que je voulais faire au départ:

Code :
  1. def meth(arg1, opt1=[], opt2=false)
  2.   opt1 = [opt1] if !opt1.is_a?(Array)
  3. end
  4. meth(arg1, ["un", "deux"])
  5. meth(arg1, "un" )


 
Avec ce que tu m'as proposé, le mieux ce serait de faire ça non?

Code :
  1. def meth(arg1, *opt1, opt2: false)
  2. end
  3. meth(arg1, "un" )
  4. meth(arg1, "un", opt2: true)
  5. meth(arg1, "un", "deux", "trois", opt2: true)


 
Merci  :jap:

Reply

Marsh Posté le 14-10-2013 à 17:50:42    

J'aurais tendance à dire oui, mais ça dépend en partie de la sémantique de tes arguments (de ce qu'ils veulent dire et de la manière dont ils sont utilisés)


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed