Est-il un moyen de propriétés définies dans IronRuby similaires à C objet # initialiseur syntaxe?

StackOverflow https://stackoverflow.com/questions/9304459

  •  25-10-2019
  •  | 
  •  

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 ?

Était-ce utile?

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 evals 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top