ruby - 如何在定义的对象上调用用户选择的方法?
问题描述
从 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.
解决方案
我猜下面的解决方案有效,但在评估 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
推荐阅读
- google-sheets - 使用 Google QUERY 从其他列返回 MAX 值和相应值
- python - Python - 寻找最佳的单字符通配符组合
- reactjs - 如何在 React js 中使用 jquery ui 滑块
- google-bigquery - 加入条件下的 BigQuery 子查询
- reactjs - 如何在 react-native 中向此按钮添加导航
- python - 球的代码出现错误 - ball = Ball(canvas, paddle, 'red') TypeError: __init__() missing 1 required positional argument: 'color'
- javascript - 函数更新联系人未定义,虽然已定义
- haskell - LYAH - 在链接 Writer monad 时理解关于“tell”的评论
- sql - 用于查找列之间共有值的 SQL 代码
- javascript - 基于您的操作系统的直接 OnClick