ruby - 在 ruby 中使方法动态化
问题描述
定义一个类如下。我想one_method
动态调用。默认情况下,wow.one_method
调用第一个one_method
. 如果我想改变方法的行为,只需调用redefine
.
我可以将该方法实现为函数类型属性,但这不是我想要的。
如果我直接使用下面的代码,会报错。能不能稍微修改一下。
class Wow
def one_method
puts "hello Ruby"
end
def redefine(what="none")
define_method :one_method do
puts what
end
end
end
wow = Wow.new
wow.redefine("Whatever I want.")
解决方案
您可以通过class_eval
或来实现instance_eval
:
class Wow
def one_method
puts "hello Ruby"
end
def redefine(what="none")
self.class.class_eval do
define_method :one_method do
puts what
end
end
end
end
wow = Wow.new
wow.one_method #=> hello Ruby
wow.redefine("Whatever I want.")
wow.one_method #=> Whatever I want.
原因是它define_method
在接收器上定义实例方法并且是类的实例方法,因此您必须在要重新定义方法的对象的特征类上调用它。
推荐阅读
- python - 当用户提供您的电子邮件地址时,如何使用 python 在 sqlite-3 中创建动态表
- xcode - AppStore,为什么网页版的应用图标会变形?
- sql - 2 个不同计数的总和:总共 4 个计数
- jsf - 自定义 JSF 控件库(自定义设计,不影响后端使用)
- javascript - 如何模拟只是一个函数的第 3 方模块('js-file-download')
- windows - Powershell Cmdlet 从网络适配器中删除静态配置的 DNS 地址
- r - 两个数据帧中的“部分”匹配 ID 并在 R 中合并
- git - 在 CentOS 服务器上安装作曲家时,无法使用 Git 读取私有仓库
- angular - 如何判断组件是否用作 MatFormField
- node.js - Mongodb,解析一个变量作为查询条件