Si vous voulez des variables spécifiques, alors pas vraiment. Utiliser la réflexion ici, même si elle était disponible, serait un problème.
Ce que vous avez ici est le cas le plus trivial. Souvent, vous verrez du code qui ressemble plus à ceci :
def initialize(title: nil, label: nil, label_width: nil, color_set: nil)
@title = title.to_s
@label = label_left.to_s
@label_width = label_width.to_i
@color_set = MyRGBConverter.to_rgb(color_set)
end
L'initialisateur est un endroit où vous pouvez effectuer toute conversion et validation nécessaires. Si certains de ces arguments doivent avoir certaines valeurs, vous aurez des tests pour cela, raise
une exception sur une erreur et ainsi de suite. Le code répétitif que vous avez ici dans le cas minimal est souvent étendu et augmenté de sorte qu'il n'y a pas de solution générale possible.
Cela conduit à un code comme celui-ci :
def initialize(title: nil, label: nil, label_width: nil, color_set: nil)
@title = title.to_s
unless (@title.match(/\S/))
raise "Title not specified"
end
@label = label_left.to_s
unless (@label.match(/\A\w+\z/))
raise "Invalid label #{@label.inspect}"
end
@label_width = label_width.to_i
if (@label_width <= 0)
raise "Label width must be > 0, #{@label_width} specified."
end
@color_set = MyRGBConverter.to_rgb(color_set)
end
Si vous ne vous souciez vraiment pas des arguments que vous recevez, vous pouvez le faire dans Ruby 2.3 avec la nouvelle fonction mots-clés-arguments prescripteur **
:
def initialize(**options)
options.each do |key, value|
instance_variable_set("@#{key}", value)
end
end
Notez que c'est potentiellement dangereux si ces valeurs sont fournies par l'utilisateur, donc vous pourriez vouloir les mettre sur liste blanche d'une manière ou d'une autre :
VALID_OPTIONS = [ :title, :label_left, :label_right, :color_set ]
def initialize(**options)
options.each do |key, value|
raise "Unknown option #{key.inspect}" unless (VALID_OPTIONS.include?(key))
instance_variable_set("@#{key}", value)
end
end
Si vous constatez que beaucoup de ces arguments sont transmis régulièrement, vous pouvez envisager de créer une sorte d'objet structuré et de le transmettre, ce qui serait une meilleure solution. Cela dépend de la façon dont votre code fonctionne.