📜  Ruby 中的自省

📅  最后修改于: 2022-05-13 01:55:21.110000             🧑  作者: Mango

Ruby 中的自省

自省Ruby 中的一种元编程方法。它让您的 Ruby 代码在运行时进行自我分析。可以考虑向程序询问有关其方法、实例变量、父级、祖先以及它响应的函数的问题。内省是向内看的意思。当我们的代码询问关于自身的问题时,这就是 ruby 中的自省。

让我们通过一个例子更好地分析这一点:
例子 :

#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

在上面的代码片段中,我们使用类和实例变量创建了一个名为Geek的类。我们使用默认参数进行初始化。现在,让我们描述一些在运行时自省中帮助我们的重要方法,然后我们将在实践中看到它。
让我们看看这些方法在实践中的使用,一次采用几个方法:

# 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

输出:

解释 :
我们首先创建了一个名为 student1 的对象并使用默认参数对其进行初始化,然后在调用方法时我们得到以下输出:

  1. .inspect :一种方法,它以可读的形式返回有关对象的所有信息,例如实例变量、类变量等。在这里,我们使用 methods.inspect 来获取对象响应的所有方法的列表。
  2. .methods :返回对象响应的所有方法。通常有四种类型的方法:public、private、protected 和 singleton。
  3. .class :一个方法,它返回实例为 Object 的类 这里的类是 Geek..
  4. .respond_to?(method name) :返回一个布尔值,告诉我们对象是否响应某个方法。在这里,我们看到对象响应了 Geek 类中定义的方法 SayHi。
  5. .class :一种方法,它返回其实例为 Object 的类。我们可以看到类变量是@name 和@stream。
  6. .class_variables 和 .instance_variables :返回类中定义的类和实例变量。我们可以看到实例变量是@@organisation。

例子 :

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

输出 :

Object
Geek
Object
Kernel
BasicObject
true
true
true

解释:

  1. .superclass :返回对象是其实例的类的超类的方法。该方法必须与.class 链接。所有类都是 Object 的子类
  2. .ancestors :一种方法,它返回对象是其实例的类的祖先。该方法必须与.class 链接。列出了基本的祖先。
  3. .is_a?还是种类? :它们几乎可以互换使用,并根据元素是否属于指定的种类返回真或假。我们检查 student1 是否是一种 Object 并且方法返回 true。
  4. .instance_of? :根据对象是否是类的实例返回真或假。我们检查 student1 是否是 Geek 类的实例,并且该方法返回 true。

借助上述方法,可以进行运行时自省,我们可以获得有关对象背景的有用信息。