我有這個類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)
兩個檔案已經在同一個檔案夾中
uj5u.com熱心網友回復:
您不需要顯式使用 getter 和 setter,attr_accessorRuby 中有
如果你initialize是空的,你可以省略它
module Callback
def add_callback(*attr_names)
attr_accessor(*attr_names)
end
end
class TaskManager
extend Callback
add_callback :on_start, :on_finished, :on_error
end
task_manager = TaskManager.new
task_manager.on_start = 10
task_manager.on_start # => 10
順便說一句,您也不需要to_s在字串插值中使用物件(它將自動應用)"@#{name.to_s}"
uj5u.com熱心網友回復:
您可以解決如下問題
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將一個模塊匯入一個類時,模塊方法將作為類方法匯入。
也請看一下答案以獲取更多詳細資訊
Ruby中的include和extend有什么區別?
需要使用可變數量的引數,如下所示
def add_callback(*attr_names); end
因為呼叫方法使用多個引數
add_callback :on_start, :on_finished, :on_error
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/516602.html
標籤:红宝石
