📅  最后修改于: 2023-12-03 15:04:56.973000             🧑  作者: Mango
在 Ruby 中,自省可以让我们了解正在执行的代码本身的特性和信息。这是一种非常强大的工具,可以帮助我们更好地理解和利用 Ruby 语言。
is_a?
和 kind_of?
方法用于确定一个对象是否为某个类或其子类的实例。
1.is_a?(Integer) # true
1.is_a?(Numeric) # true
1.is_a?(Float) # false
instance_of?
方法用于确定一个对象是否是一个特定类的实例,而不是其子类的实例。
1.instance_of?(Integer) # true
1.instance_of?(Numeric) # false
respond_to?
方法用于确定一个对象是否可以响应某个方法。
1.respond_to?(:to_s) # true
1.respond_to?(:foo) # false
class
方法返回一个对象所属的类,superclass
方法返回该类的父类。
1.class # Integer
1.class.superclass # Numeric
ancestors
方法返回一个类的祖先链。
String.ancestors # [String, Comparable, Object, Kernel, BasicObject]
singleton_methods
方法用于返回一个类的单例方法。
str = "Hello World"
def str.count_words
self.split.size
end
str.singleton_methods # [:count_words]
instance_methods
方法用于返回一个类的实例方法。
String.instance_methods(false) # [:%, :*, :+, :ascii_only?, ...]
class_variables
方法用于返回一个类的类变量。
class Foo
@@var = 1
end
Foo.class_variables # [:@@var]
method
方法用于获取一个方法对象,可以通过这个对象调用该方法。
str = "Hello World"
m = str.method(:upcase)
m.call # "HELLO WORLD"
arity
方法用于返回一个方法的参数个数。
def foo(a, b = 1, *c, d, &e)
end
method(:foo).arity # -3
owner
方法用于返回一个方法所属的类或模块。
class Foo
def bar
end
end
Foo.instance_method(:bar).owner # Foo
source_location
方法用于返回一个方法的定义文件和行号。
def foo
end
method(:foo).source_location # ["/path/to/file.rb", 42]
以上是 Ruby 中一些常用的自省方法和技巧,它们可以让我们更好地理解和使用 Ruby 语言。无论是开发 Ruby 应用程序,还是编写 Ruby 库和框架,自省都是非常重要的。