【发布时间】:2016-09-19 15:38:51
【问题描述】:
在 MyClass 中,我有一个类方法可以动态创建某些实例方法(使用 define_method)。但是,我也想动态创建类方法。
如下所示,我在这个范围内使用class << self 并调用define_method(实际上我不确定范围是否是正确的词,尽管块似乎也不正确。什么是引用 class << self?) 内执行的所有内容的正确术语来定义类方法。
但是,我想使用来自class << self 之外的变量来命名类方法,即column_name。
因此,我想在class << self 中使用变量column_name 来命名define_method 中的类方法。
当我尝试运行 create_methods 时出现错误:
NameError: 未定义的局部变量或方法 'column_name' for # from (pry):7:in 'singleton class'
class MyClass
@columns = ['col1', 'col2']
def self.create_methods
@columns.each do |column_name|
define_method(column_name) { |column_name| puts column_name }
class << self
define_method(column_name) { |column_name| puts "class_method defined" }
end
end
end
end
如何从单例类中访问变量?在这里完成我想要完成的事情(创建类方法)的最佳方式是什么?
注意:我已经尝试过define_singleton_method 方法,它似乎对我想做的事情有效。它是否完全完成了我想要做的事情?即使是这样,我关于使用class << self 的问题仍然存在。
【问题讨论】:
-
在我看来,您正在动态尝试在另一个类方法中创建一个类方法。我不太清楚为什么。
-
我正在实现 Active Record 的一些基本功能。特别是我有一个 SQLObject 类,它对 SQLite 数据库进行查询。我的模型继承自 SQLObject。后者有一个类方法,它根据模型类的名称生成一些方法。其中一种方法是类方法“find”,它通过 id 查找记录。但我还想生成“find_by_column_name”方法,该方法在数据库中查询具有特定列的给定值的条目。这一切都应该自动完成,只需要继承类的名称。
标签: ruby