81 votes

En Ruby, existe-t-il un moyen de surcharger le constructeur d'initialisation?

En Java, vous pouvez surcharger les constructeurs:

 public Person(String name) {
  this.name = name;
}
public Person(String firstName, String lastName) {
   this(firstName + " " + lastName);
}
 

Ruby existe-t-il un moyen d'obtenir le même résultat: deux constructeurs prenant des arguments différents?

85voto

Steve Weet Points 15395

La réponse est Oui et Non.

Vous pouvez obtenir le même résultat que vous pouvez dans d'autres langues en utilisant une variété de mécanismes, y compris :-

  • Les valeurs par défaut pour les arguments
  • Listes d'arguments Variable (Le dossier de l'opérateur)
  • La définition de votre argument comme une table de hachage

Le réel de la syntaxe de la langue ne permet pas de définir une méthode de deux fois, même si les arguments sont différents.

En considérant les trois options ci-dessus ceux-ci pourraient être mis en œuvre avec votre exemple comme suit

# As written by @Justice
class Person
  def initialize(name, lastName = nil)
    name = name + " " + lastName unless lastName.nil?
    @name = name
  end
end


class Person
  def initialize(args)
    name = args["name"] + " " + args["lastName"] unless args["lastName"].nil?
    @name = name
  end
end

class Person
  def initialize(*args)
    #Process args (An array)
  end
end

Vous rencontrerez le second mécanisme est fréquemment à l'intérieur du code Ruby, en particulier dans les Rails de car il offre le meilleur des deux mondes et permet pour certains de sucre syntaxique pour produire assez de code, en particulier de ne pas avoir à placer le passé de hachage à l'intérieur des accolades.

Cette wikibooks lien fournit encore plus de lecture

30voto

Andrew Grimm Points 22996

J'ai tendance à faire

 class Person
  def self.new_using_both_names(first_name, last_name)
    self.new([first_name, last_name].join(" "))
  end

  def self.new_using_single_name(single_name)
    self.new(single_name)
  end

  def initialize(name)
    @name = name
  end
end
 

Mais je ne sais pas si c'est la meilleure approche.

4voto

yfeldblum Points 42613
class Person
  def initialize(name, lastName = nil)
    name = name + " " + lastName unless lastName.nil?
    @name = name
  end
end

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