7
votes

Appelez la méthode de la classe privée de la méthode d'instance privée

Je suis nouveau à Ruby et est venu du monde C #. En C #, il est légal de faire des choses comme ceci:

class MyModel < ActiveRecord::Base

  def self.create_instance
    model = MyModel.new
    MyModel.init_some_dependencies_class(model)
    model
  end

  def initialize_instance
    # do some other work
    other_init
    # call private method
    init_some_dependencies
  end

  private

  def init_some_dependencies
     MyModel.init_some_dependencies_class(self) # now this fails with exception
  end

  def self.init_some_dependencies_class(model)
    # do something with model
  end

  private_class_method :init_some_dependencies_class

end


0 commentaires

4 Réponses :


-3
votes

Actalally, c'est sûrement.

Certaines stratégies OO de Ruby ( privé & public mots-clés, etc.) vient de C ++, vous pouvez donc obtenir presque la même utilisation.


3 commentaires

Voyons une documentation pour cela.


Je ne savais pas que Matz pouvait voir l'avenir! (Astuce: Ruby est sorti de presque une décennie avant C #.) Le modèle OO de Ruby est inspiré par SmallTalk's, qui est jolie aussi loin que possible de C ++ et C #.


@ Jörgwmittag je veux dire, ce qui est important ici n'est pas ce que le modèle d'objet de Ruby de (de couse je sais que c'est SmallTalk). Ruby est également bénéficiant de la stratégie OO de C ++, telle que privé et public .



2
votes

Vous pouvez utiliser

model = MyModel.new
model.send :init_some_dependencies


0 commentaires

5
votes

D'abord, je vais essayer d'expliquer pourquoi le code ne fonctionne pas

class MyModel < ActiveRecord::Base

  def self.create_instance
    model = MyModel.new
    domain = MyModelDomain.new(model)
    domain.init_some_dependencies
    domain.my_model
  end

  def initialize_instance
    # do some other work
    other_init

    domain = MyModelDomain.new(self)
    domain.init_some_dependencies
  end
end


0 commentaires

-1
votes

en C # Il est légal de faire des choses comme ceci: p>

class MyModel

  def self.create_instance
    model = MyModel.new
    model.send(:init_some_dependencies, 10, 20)
  end


  private

  def init_some_dependencies(*args)
    puts "Dependencies have been initialized with: #{args}!"
  end
end


MyModel.create_instance

--output:--
Dependencies have been initialized with: [10, 20]!

2 commentaires

C # n'applique pas la vie privée, vous êtes capable d'accéder à un privé dans C # également via la réflexion.


@Esailija, je ne sais rien de c #. C'était une question rubis.