MST
星途 面试题库

面试题:Ruby 动态编程特性之方法定义相关

在Ruby中,如何在运行时动态定义一个实例方法?请给出代码示例,并解释该方法在不同对象实例上的调用机制。
27.6万 热度难度
编程语言Ruby

知识考点

AI 面试

面试题答案

一键面试

在Ruby中,可以使用 define_method 方法在运行时动态定义实例方法。以下是代码示例:

class MyClass
  def initialize(name)
    @name = name
  end
end

# 动态定义实例方法
MyClass.class_eval do
  define_method(:greet) do
    puts "Hello, I'm #{@name}"
  end
end

# 创建两个对象实例
obj1 = MyClass.new('Alice')
obj2 = MyClass.new('Bob')

# 调用动态定义的方法
obj1.greet
obj2.greet

调用机制解释

  1. class_evalclass_eval 是Ruby类的一个方法,它允许在类的上下文中执行一段代码块。在这个例子中,我们使用 class_eval 来为 MyClass 类定义新的实例方法。

  2. define_method:在 class_eval 的代码块中,我们使用 define_method 方法来定义一个名为 greet 的新实例方法。这个方法接受一个代码块作为参数,该代码块就是新方法的实现。

  3. 对象实例调用:当我们创建 obj1obj2 这两个 MyClass 的对象实例后,它们都可以调用动态定义的 greet 方法。这是因为 define_method 定义的方法是属于类的实例方法,所有该类的对象实例都可以访问和调用它。每个对象实例在调用 greet 方法时,会根据自身的实例变量 @name 的值来输出不同的问候语,这体现了面向对象编程中对象实例各自维护自己的状态的特性。