2009-02-13 4 views
4

Je lisais un texte décrivant Ruby et il a dit ce qui suit:Quand vous dites que Ruby est réfléchissant, est-ce que cela se réfère principalement à "dactylographie"?

Ruby est considéré comme une « réflexion » langue, car il est possible pour un programme Ruby s'analyser (en termes de maquillage), faire ajustements à la façon dont il fonctionne, et même écraser son propre code avec tout autre code .

Je suis confus par ce terme « réflexion » - est-ce parle surtout de la façon dont Ruby peut regarder une variable et déterminer si elle est un entier ou une chaîne (duck typing), par exemple:

x = 3 
x = "three" # Ruby reassigns x to a String type 
+0

Je pense que vous êtes également confus au sujet du terme «dactylographie». Il ne s'agit pas de regarder une variable et de déterminer son type, mais plutôt de traiter tout type qui répond à des méthodes spécifiques de la même manière. Par exemple "123" .size et [1,2,3] .size - ... (suite au commentaire suivant) – Dema

+1

donc, si vous créez une méthode comme ceci "def print_size (obj) met obj.size; end "- Peu importe si vous lui passez une chaîne ou un tableau, cela fonctionnera quel que soit le type car tous les deux implémentent" size ". En d'autres termes, ils «charlatent» tous les deux, ils doivent donc être un «canard» (ce qui n'est pas vrai) - c'est ce que pense Ruby. – Dema

Répondre

1

réouverture de classe est un bon exemple. Voici un exemple simple:

class Integer 
    def moxy 
     if self.zero? 
      self - 2 
     elsif self.nonzero? 
      self + 2   
     end  
    end 
end 

puts 10.moxy 

Par la réouverture d'une classe standard Ruby - Entier - et définir une nouvelle méthode en son sein appelé « Moxy », nous pouvons effectuer une opération redéfinie directement sur un certain nombre. Dans ce cas, j'ai défini cette méthode 'moxy' pour soustraire 2 de l'entier si c'est zéro et en ajouter deux s'il n'est pas nul. Cela rend la méthode moxy disponible pour tous les objets de la classe Integer dans Ruby. (Ici, nous utilisons le mot-clé 'self' pour obtenir le contenu de l'objet entier).

Comme vous pouvez le voir, il est une fonctionnalité très puissante de Ruby.

EDIT: Certains commentateurs ont mis en doute que ce soit vraiment reflection. En anglais, le mot «réflexion» fait référence à vos propres pensées. Et c'est certainement un aspect important de la réflexion dans la programmation aussi - en utilisant des méthodes Ruby comme is_a, kind_of, instance_of pour effectuer une auto-inspection de l'exécution. Mais la réflexion se réfère également à la capacité d'un programme à modifier son propre comportement au moment de l'exécution. Réouverture des classes est l'un des exemples clés de cela. Il est également appelé monkey patching.Ce n'est pas sans risques mais tout ce que je fais c'est de le décrire ici dans le contexte de la réflexion, dont c'est un exemple.

+1

Certainement une fonctionnalité puissante, mais êtes-vous sûr que c'est un exemple de réflexion? Je ne sais pas si travailler avec soi est, à proprement parler, une «réflexion». Je pensais que la réflexion était plus quand vous interrogez les classes et les objets à l'exécution pour savoir ce qu'ils sont et ce qu'ils peuvent faire. – Ethan

+0

Ouais, ce n'est pas vraiment une fonctionnalité de réflexion, mais toujours une fonctionnalité intéressante. –

+0

Je comprends la source de votre confusion. Je vais éditer ma réponse pour expliquer mon raisonnement de citer la réouverture de classe comme un exemple non ambigu de réflexion. – Serx

2

Non, cela signifie que vous pouvez émettre une commande rubis pour obtenir des informations, eh bien, à peu près tout. Par exemple, vous pouvez taper la commande File.methods() pour obtenir une liste de toutes les méthodes appartenant au module File. Vous pouvez faire des choses similaires avec des classes et des objets - des méthodes d'inscription, variables, etc.

9

Dire Ruby est « réfléchissant » signifie que vous pouvez, par exemple, savoir à l'exécution quelles méthodes une classe a:

>> Array.methods 
=> ["inspect", "private_class_method", "const_missing", 
[ ... and many more ... ] 

(vous pouvez faire la même chose avec un objet de la classe.)

Ou vous pouvez savoir quelle classe un objet donné est ...

>> arr = Array.new 
=> [] 
>> arr.class 
=> Array 

Et savoir ce qu'il est dans la hiérarchie des classes ...

>> arr.kind_of? 
>> arr.kind_of? Array 
=> true 
>> arr.kind_of? String 
=> false 

Dans la citation où ils disent « il est possible pour un programme Ruby à s'analyser » c'est ce dont ils parlent.

D'autres langages tels que Java font aussi, mais avec Ruby il est plus facile, plus pratique et plus d'une partie quotidienne de l'utilisation de la langue. Par conséquent, Ruby est "réfléchi".

0

Il se réfère principalement à la facilité d'inspection et de modification des représentations internes pendant l'exécution dans les programmes Ruby, tels que les classes, les constantes, les méthodes, etc.

La plupart des langages modernes offrent des capacités de réflexion (même celles typées statiquement comme Java), mais en Ruby, il est si facile et naturel d'utiliser ces fonctionnalités, ce qui fait vraiment la différence quand vous en avez besoin.

Cela rend juste la méta-programmation, par exemple, une tâche presque triviale, ce qui n'est pas vrai du tout dans d'autres langages, même dynamiques.

Questions connexes