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
4 Réponses :
Actalally, c'est sûrement. P>
Certaines stratégies OO de Ruby ( privé code> & public code> mots-clés, etc.) vient de C ++, vous pouvez donc obtenir presque la même utilisation. P>
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é code> et public code>.
Vous pouvez utiliser
model = MyModel.new model.send :init_some_dependencies
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
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]!
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.