MST
星途 面试题库

面试题:Ruby对象方法的动态调用与元编程

假设你有一个Ruby类,类中有多个方法。现在需要通过用户输入的方法名来动态调用这些方法,且这个类中的方法名可能是在运行时动态添加的。请描述实现思路并给出示例代码,同时说明在元编程中method_missing方法的作用及使用场景。
41.6万 热度难度
编程语言Ruby

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 定义一个Ruby类,在类中定义一些方法(也可以在运行时动态添加方法)。
  2. 获取用户输入的方法名。
  3. 使用public_send方法(或者send方法,但public_send只调用公共方法更安全)根据用户输入的方法名动态调用类中的方法。

示例代码

class DynamicMethodCall
  def method1
    puts "This is method1"
  end

  def method2
    puts "This is method2"
  end
end

# 获取用户输入
puts "请输入要调用的方法名:"
method_name = gets.chomp

obj = DynamicMethodCall.new
begin
  obj.public_send(method_name)
rescue NoMethodError
  puts "该方法不存在"
end

method_missing方法的作用及使用场景

作用

method_missing是Ruby元编程中的一个重要方法,当对象接收到一个无法识别的方法调用时,Ruby会调用method_missing方法,并将未识别的方法名及参数传递给它。这使得开发者可以在运行时对未定义的方法做出响应,而不是直接抛出NoMethodError错误。

使用场景

  1. 模拟方法调用:可以根据传入的方法名模拟出不同的行为,例如实现一个简单的DSL(领域特定语言)。
  2. 延迟加载:当某个方法可能不常用,通过method_missing在需要时再加载相关代码,提高程序的启动性能。
  3. 代理模式:在代理对象中,通过method_missing将方法调用转发给实际对象,实现代理功能。

示例代码展示method_missing的使用:

class MethodMissingExample
  def method_missing(method_name, *args, &block)
    puts "你调用了一个不存在的方法: #{method_name}"
    puts "参数是: #{args.join(', ')}" if args.any?
  end
end

obj = MethodMissingExample.new
obj.non_existent_method('参数1', '参数2')

上述代码中,当调用obj对象上不存在的non_existent_method方法时,method_missing方法会被触发,并打印相关信息。