2017-04-13 1 views
-1

comment est-il possible dans l'exemple ci-dessous d'imprimer le nom de la classe ValidatorStatus?Dans ruby ​​de classe avec fonction sans auto comment obtenir le nom de la classe actuelle?

class ValidatorStatus 
    def initialize(host, msg) 
    @host = host 
    @msg = msg 
    end 

    attr_accessor :host 
    attr_accessor :msg 

    def to_s 
    puts %|How to have this print *ValidatorStatus* 
      by dynamically discovering class name? 
      also if im a subclass of this should print 
      the subclass name| 
    end 
end 
+6

L'allégation « sans soi » est absurde. – mudasobwa

Répondre

4
self.class.name 

Est-ce que tout ce que vous voulez. Mais comme vous avez ajouté la restriction de ne pas utiliser self:

public_send(:class).name 
+2

... qui bien sûr * utilise implicitement 'self', car c'est juste du sucre syntaxique pour' self.public_send (: class) .name'. – user1934428

+1

@ user1934428, bien sûr. (: – ndn

0

Comme d'autres l'ont dit, la bonne réponse est self.class.name

Si vous voulez faire preuve de créativité, vous pouvez utiliser:

class A 
    def to_s 
    Module.nesting.first.to_s 
    end 
end 

puts A.new 
# A 

Il n'y a pas de self ici, pas même un implicite, caché.

Il ne retourne pas la sous-classe si:

class B < A 
end 

puts B.new 
# A 

Une autre possibilité serait d'analyser le fichier en cours:

class C < A 
    def to_s 
    File.readlines(__FILE__).take(__LINE__).reverse.join[/(?<=^class)\w+/] 
    end 
end 

puts C.new 
# C 
+1

J'aime le dernier meilleur. Force brute FTW. –