Introspección en Ruby

La introspección es un método de metaprogramación en Ruby . Le da a su código Ruby para analizarse a sí mismo en tiempo de ejecución. Se puede considerar hacer preguntas al programa sobre sus métodos, variables de instancia, padres, ancestros y a qué funciones responde . Introspección significa mirar hacia adentro. cuando nuestro código hace preguntas sobre sí mismo, eso es introspección en Ruby.

Analicemos esto mejor con un ejemplo:
Ejemplo:

#creating a class and associated methods
class Geek
    attr_accessor :name, :stream
    @@organisation = "GeeksForGeeks"
    def initialize(name ="geek",stream="Computer Science")
        @name = name
        @stream = stream
    end
    def SayHi
        "Hello #{name}"
    end
    def Show
        "You belong to #{stream}"
    end
end

En el fragmento anterior, creamos una clase llamada Geek con variables de clase y de instancia . Usamos parámetros predeterminados para la inicialización. Ahora, describamos ciertos métodos importantes que nos ayudan en la introspección en tiempo de ejecución y luego lo veremos en la práctica.
Veamos el uso de estos métodos para la introspección en la práctica tomando algunos métodos a la vez:

# Creating an object and calling the methods
student1 = Geek.new()
puts student1.methods.inspect
puts student1.class.name
puts student1.respond_to?("SayHi")
puts student1.instance_variables
puts student1.class.class_variables

Producción:

[:name, :name=, :stream, :SayHi, :Show, :stream=, :instance_of?, :kind_of?, :is_a?, :tap, :public_send, :remove_instance_variable, :instance_variable_set, :method, :public_method , :singleton_method, :extend, :define_singleton_method, :to_enum, :enum_for, :, :===, :=~, :!~, :eql?, :respond_to?, :freeze, :inspect, :object_id, :send , :display, :to_s, :nil?, :hash, :class, :singleton_class, :clone, :dup, :inself, :taint, :tainted?, :untaint, :untrust, :untrusted?, :trust, : congelado?, :métodos, :singleton_methods, :protected_methods, :private_methods, :public_methods, :instance_variable_get, :instance_variables, :instance_variable_defined?, :!, :==, :!=, :__send__, :equal?, :instance_eval, : instance_exec, :__id__]
Geek
verdadero
@nombre
@stream
@@organización

Explicación:
primero creamos un objeto llamado estudiante1 y lo inicializamos con los parámetros predeterminados, luego, al llamar a los métodos, obtuvimos los siguientes resultados:

  1. .inspect: un método que devuelve toda la información sobre el objeto, como variables de instancia, variables de clase, etc. en forma legible. Aquí, usamos métodos. inspeccionar para obtener una lista de todos los métodos a los que responde el objeto.
  2. .methods : devuelve todos los métodos a los que responde un objeto. Hay cuatro tipos de métodos en general: público, privado, protegido y singleton.
  3. .class: un método que devuelve la clase cuya instancia es un objeto. La clase aquí es Geek..
  4. .respond_to?(nombre del método) : Devuelve un valor booleano que nos dice si el objeto responde a un determinado método o no. Aquí vemos que el objeto responde al método SayHi que está definido en la clase Geek.
  5. .class: un método que devuelve la clase cuya instancia es un objeto. Podemos ver que las variables de clase son @name y @stream.
  6. .class_variables y .instance_variables : devuelve las variables de clase e instancia definidas en una clase. Podemos ver que la variable de instancia es @@organization.

Ejemplo :

puts student1.class.superclass
puts student1.class.ancestors
puts student1.is_a?(Object)
puts student1.kind_of?(Object)
puts student1.instance_of?(Geek)

Producción :

Object
Geek
Object
Kernel
BasicObject
true
true
true

Explicación:

  1. .superclass: un método que devuelve la superclase de la clase de la que un objeto es una instancia. El método tiene que estar enstringdo con .class. Todas las clases son subclases de Object
  2. .ancestors : un método que devuelve los ancestros de la clase de la que un objeto es una instancia. El método tiene que estar enstringdo con .class. Los antepasados ​​básicos se enumeran.
  3. .¿es un? o tipo_de? : Estos se pueden usar casi indistintamente y devuelven verdadero o falso dependiendo de si un elemento pertenece al tipo especificado o no. Verificamos si estudiante1 es un tipo de Objeto y los métodos devuelven verdadero.
  4. .¿en vez de? : Devuelve verdadero o falso dependiendo de si un objeto es una instancia de una clase. Verificamos si estudiante1 es una instancia de la clase Geek y el método devuelve verdadero.

Con la ayuda de los métodos anteriores, se puede llevar a cabo una introspección en tiempo de ejecución y podemos obtener información útil sobre la historia de fondo de un objeto.

Publicación traducida automáticamente

Artículo escrito por tirtharajsengupta y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *