Est-il un moyen de propriétés définies dans IronRuby similaires à C objet # initialiseur syntaxe?
Question
J'utilise IronRuby pour faire des scripts dans mon application.
J'ai beaucoup de commandes (objets CLR) Je dois créer et exécuter, mais la plupart des commandes ont besoin de définir les propriétés sur eux et je veux éviter d'avoir à assigner la commande à une variable juste pour que je puisse définir les propriétés.
Est-il possible de le faire comme l'objet C # initialiseur syntaxe ?
La solution
Il n'y a pas moyen intégré de la définition des propriétés lors de la construction des objets CLR, comme il est une des caractéristiques de Ruby lui-même. Cependant, bien que Python ne supporte pas non plus, IronPython pris en charge par le nom permettant paramètres à fournir aux constructeurs . Étant donné que Ruby ne supporte pas les paramètres nommés, nous ne voulions pas faire appliquer un modèle de paramètre nommé, que ce soit un Hash
comme dernier argument, ou un bloc qui est instance_eval
'd contre l'objet la construction, ou quelque chose d'autre gens viennent avec.
Cela étant dit, les stratégies de mise en œuvre initialiseurs d'objets peuvent être écrits en Ruby pur sans aucun soutien particulier dans IronRuby. Je vais décrire à la fois énumérés ci-dessus, mais je me sens libre d'expérimenter si elles ne sont pas exactement la syntaxe que vous recherchez.
En supposant que la classe CLR suivante (écrit en C #):
namespace TestLib {
public class TestObj1 {
public string Prop1 { get; set; }
public string Prop2 { get; set; }
}
}
Vous pourriez imaginer des propriétés d'initialisation avec un bloc passé au constructeur:
testobj = TestObj1.new do
self.prop1 = "Prop1 Value"
self.prop2 = "Prop2 Value"
end
Et voici comment vous pouvez remplacer la méthode de TestObj1.new
à l'appui que:
class TestObj1
def self.new(*args, &block)
obj = super(*args)
obj.instance_eval &block
obj
end
end
Depuis ce eval
s fait bloc contre l'objet nouvellement créé, vous pouvez exécuter un code Ruby à l'intérieur du bloc. Ce modèle est très populaire lors de la création et les API DSLs plus naturelles Ruby.
Ou, si vous préférez utiliser la syntaxe de Hash
de clément de Ruby dans les arguments de la méthode:
testobj = TestObj1.new :prop1 => "Prop1 value", :prop2 => "Prop2 value"
Ensuite, voici comment vous pouvez remplacer la méthode .new
:
class TestObj1
def self.new(*args)
last_arg = args[-1]
if last_arg.kind_of?(Hash)
first_args = args[0..-2]
obj = super(*first_args)
last_arg.each do |prop, val|
obj.send("#{prop}=", val)
end
return obj
end
super(*args)
end
end
L'option Hash
est sans aucun doute un peu plus compliqué, mais un peu plus performant (car il évite eval
) et est un modèle plus fréquent chez Ruby pour exposer les paramètres nommés.