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
输出:
[: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, :itself, :taint, :tainted?, :untaint, :untrust, :untrusted?, :trust, :frozen?, :methods, :singleton_methods, :protected_methods, :private_methods, :public_methods, :instance_variable_get, :instance_variables, :instance_variable_defined?, :!, :==, :!=, :__send__, :equal?, :instance_eval, :instance_exec, :__id__]
Geek
true
@name
@stream
@@organisation
解释 :
我们首先创建了一个名为 student1 的对象并使用默认参数对其进行初始化,然后在调用方法时我们得到以下输出:
- .inspect :一种方法,它以可读的形式返回有关对象的所有信息,例如实例变量、类变量等。在这里,我们使用 methods.inspect 来获取对象响应的所有方法的列表。
- .methods :返回对象响应的所有方法。通常有四种类型的方法:public、private、protected 和 singleton。
- .class :一个方法,它返回实例为 Object 的类 这里的类是 Geek..
- .respond_to?(method name) :返回一个布尔值,告诉我们对象是否响应某个方法。在这里,我们看到对象响应了 Geek 类中定义的方法 SayHi。
- .class :一种方法,它返回其实例为 Object 的类。我们可以看到类变量是@name 和@stream。
- .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
解释:
- .superclass :返回对象是其实例的类的超类的方法。该方法必须与.class 链接。所有类都是 Object 的子类
- .ancestors :一种方法,它返回对象是其实例的类的祖先。该方法必须与.class 链接。列出了基本的祖先。
- .is_a?还是种类? :它们几乎可以互换使用,并根据元素是否属于指定的种类返回真或假。我们检查 student1 是否是一种 Object 并且方法返回 true。
- .instance_of? :根据对象是否是类的实例返回真或假。我们检查 student1 是否是 Geek 类的实例,并且该方法返回 true。
借助上述方法,可以进行运行时自省,我们可以获得有关对象背景的有用信息。