ruby - 在 define_method 定义的方法上调用 super

标签 ruby metaprogramming super superclass

我创建了一个 Model 类,我在其中定义了基于 User(继承自 Model)中调用的方法(属性)的方法。问题是我不能覆盖define_method定义的方法,并调用super传递给定义的方法。我猜这是因为定义的方法被添加到用户本身,而不是模型,所以它实际上在父类(super class)(即模型)中没有方法。

之所以要这样做,是因为大多数属性应该直接保存到数据库中,而一些属性,如密码,需要一些额外的处理。

class Model
  def self.attribute(name)
    define_method(name) do
      self
    end
  end  
end

class User < Model
  attribute :password
end

class User2 < Model
  attribute :password

  def password
    super
  end
end

@user = User.new
puts @user.password # => <User:0x00000100845540>

@user2 = User2.new
puts @user2.password
# define_super.rb:17:in `password': super: no superclass method 
# `password' for #<User2:0x00000100845578> (NoMethodError)
# from define_super.rb:25:in `<main>'

有什么方法可以更改代码以使其正常工作吗?我需要一种方法来覆盖动态创建的方法。

最佳答案

父类(super class)上定义方法:

class Model
  def self.attribute(name)
    superclass.send :define_method, name do
      self
    end
  end  
end

关于ruby - 在 define_method 定义的方法上调用 super,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1994978/

相关文章:

ruby - 如何为 Chef 处理程序安装依赖项?

ruby-on-rails - 基于 ruby​​ 的服务器的自适应图像

tensorflow - super (类型,对象): obj must be an instance or subtype of type in Keras

python - Python 中的定义方法

c# - 我可以使用 Roslyn 进行编译时代码重写吗?

java - 对 super() 的调用必须是方法内的第一个语句消息

java - 如果子类构造函数调用的参数结构与其父类(super class)构造函数不匹配,会发生什么

ruby - 从 Ruby 中的 CSV 文件获取 header 的最简单方法是什么?

ruby - 使用 Rake 或 Gem 构建脚本?

ruby - 在 ruby​​ 中动态定义 memoized getter