首页 > 解决方案 > 如何在定义的对象上调用用户选择的方法?

问题描述

从 String 派生一个类,该类在 Strings 上定义了一些方法,例如排除?(包括的opp)。接受参数的方法也很少(必需+可选)。

从命令行, * 通过向用户询问新类的输入字符串来创建对象 * 向用户显示您定义的所有方法(不是由字符串或超类定义的) * 提示用户调用对象的方法名称 * 询问此方法所需的任何必需/可选参数 * 一旦用户输入方法名称和参数,执行它并在命令行上显示结果。

将动态类的引用存储在实例变量中,并在调用方法中通过该实例变量调用方法。但是在运行时,即使方法在类中退出,也不会调用这些。有什么建议么 ?

class String
   def initialize(class_name)
     @klass = Class.new
     Object.const_set(class_name, @klass)
   end

   def palindrome?
     self == self.reverse
   end

   def append(apnd)
     self.to_s + "\n" + apnd
   end

   def new_method(method_name, code_str)
     @klass.instance_eval do
         define_method(method_name) { instance_eval(code_str)}
     end
   end

   def call(method_name)
     if @klass.respond_to?(method_name) && %w[palindrome? append].include?(method_name)
       @klass.send(method_name)
     end
   end
end

puts "Please enter the class name:"
class_name = gets.chomp


puts "Please enter the method name you wish to define:"
method_name = gets.chomp

puts "Please provide any optional arguments for entered method:"
code_str = gets.chomp

obj = String.new(class_name)
puts obj.call(method_name)
#Expected result : Entered method should be evaluated on user provided argument.
"Please enter the method name you wish to define:" => palindrome?
"Please provide any optional arguments for entered method:" =>  GAG
output => true 
#As palindrome input argument was a palindrome hence method should evaluate #statement or block true for given object.

标签: ruby

解决方案


我猜下面的解决方案有效,但在评估 block 时仍然发现了一些小故障。

class NewClass < String
   # Returns true if the string is its own reverse.
   def initialize(class_name)
     @klass = Class.new
     Object.const_set(class_name, @klass)
     display_methods
   end

   def palindrome?
     self == self.reverse
   end

   def append(apnd)
     self.to_s + "\n" + apnd
   end

   def new_method(method_name, code_str)
     @klass.instance_eval do
         define_method(method_name) { eval "#{code_str}"}
     end
   end

   def call(method_name)
     if @klass.respond_to?(method_name)
       @klass.public_send(method_name)
     end
   end
end

puts "Please enter the class name:"
class_name = gets.chomp

puts " Select your method from 'palindrome?' or 'append' "

puts "Please enter the method name you wish to define:"
method_name = gets.chomp

puts "Please provide any optional arguments for entered method:"
code_str = gets.chomp

obj = NewClass.new(class_name)
puts obj.method(method_name).call

推荐阅读