Include模块Ruby上未定义的方法

wz1wpwve  于 2022-11-04  发布在  Ruby
关注(0)|答案(2)|浏览(181)

我有这个类Callback来充当自定义attr_accessor

module Callback
  def add_callback(name)
    define_method(name) do
      instance_variable_get("@#{name.to_s}")
    end

    define_method("#{name.to_s}=") do |value|
      instance_variable_set("@#{name.to_s}", value)
    end
  end
end

我确实将该类包含在主类中

require_relative "./callback"
class TaskManager
  include Callback
  add_callback :on_start, :on_finished, :on_error

  def initialize; end
end

但是当我在irb中需要它时,我得到了未定义的方法错误

require "./task_manager.rb"
irb(main):003:0> require "./task_manager.rb"
/Users/task_manager.rb:9:in `<class:TaskManager>': undefined method `add_callback' for TaskManager:Class (NoMethodError)

两个文件已在同一文件夹中

6jygbczu

6jygbczu1#

您不需要显式地使用getter和setter,Ruby中有attr_accessor
如果您的initialize为空,则可以忽略它
第一个
顺便说一句,你也不需要使用to_s对象字符串插值(它将自动应用)在你的"@#{name.to_s}"

2vuwiymt

2vuwiymt2#

你可以解决如下问题

module Callback
  def add_callback(*attr_names)
    attr_names.each do |name|  
        define_method(name) do
          instance_variable_get("@#{name.to_s}")
        end

        define_method("#{name.to_s}=") do |value|
          instance_variable_set("@#{name.to_s}", value)
        end
    end
  end
end
class TaskManager
  extend Callback
  add_callback :on_start, :on_finished, :on_error

  def initialize; end
end

当您将一个模块include到一个类中时,该模块方法将作为示例方法导入。
但是,当您将一个模块extend到一个类中时,该模块方法将作为类方法导入。
也请看一下下面的答案了解更多详情
What is the difference between include and extend in Ruby?
需要使用可变数量的参数,如下所示

def add_callback(*attr_names); end

因为调用方法时使用了多个参数

add_callback :on_start, :on_finished, :on_error

相关问题