Include模块Ruby上未定义的方法

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

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

  1. module Callback
  2. def add_callback(name)
  3. define_method(name) do
  4. instance_variable_get("@#{name.to_s}")
  5. end
  6. define_method("#{name.to_s}=") do |value|
  7. instance_variable_set("@#{name.to_s}", value)
  8. end
  9. end
  10. end

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

  1. require_relative "./callback"
  2. class TaskManager
  3. include Callback
  4. add_callback :on_start, :on_finished, :on_error
  5. def initialize; end
  6. end

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

  1. require "./task_manager.rb"
  2. irb(main):003:0> require "./task_manager.rb"
  3. /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#

你可以解决如下问题

  1. module Callback
  2. def add_callback(*attr_names)
  3. attr_names.each do |name|
  4. define_method(name) do
  5. instance_variable_get("@#{name.to_s}")
  6. end
  7. define_method("#{name.to_s}=") do |value|
  8. instance_variable_set("@#{name.to_s}", value)
  9. end
  10. end
  11. end
  12. end
  13. class TaskManager
  14. extend Callback
  15. add_callback :on_start, :on_finished, :on_error
  16. def initialize; end
  17. end

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

  1. def add_callback(*attr_names); end

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

  1. add_callback :on_start, :on_finished, :on_error
展开查看全部

相关问题