我試圖使用ruby的forwardable
module來使一個類中的某些變量可以被另一個類訪問。但是我在做這件事時遇到了一些麻煩。指定可轉發的類
看來,我能「前進」的self
(代碼第一位)內的一些變數,但是我無法一類(代碼第二位)內提出了一些變量
以下工作原理:
require 'forwardable'
module ModuleName
#
class << self
attr_accessor :config
def run
@config = {hey: 'hi', jay: 'ji'}
puts "1) Config = #{config}"
end
end
#
class Start
extend Forwardable
def_delegators ModuleName, :config
def run
puts "2) Config = #{config}"
end
end
end
ModuleName.run
(ModuleName::Start.new).run
#=> 1) Config = {:hey=>"hi", :jay=>"ji"}
#=> 2) Config = {:hey=>"hi", :jay=>"ji"}
但這並不
require 'forwardable'
module ModuleName
#
class Data
attr_accessor :config
def run
@config = {hey: 'hi', jay: 'ji'}
puts "1) Config = #{config}"
end
end
#
class Start
extend Forwardable
def_delegators ModuleName::Data, :config
def run
puts "2) Config = #{config}"
end
end
end
(ModuleName::Data.new).run
(ModuleName::Start.new).run
#=> 1) Config = {:hey=>"hi", :jay=>"ji"}
#=> /Users/ismailm/Desktop/ex.rb:17:in `run': undefined method `config' for ModuleName::Data:Class (NoMethodError)
你能在固定的這部分代碼幫助...
不應該是'def_delegators ModuleName :: Data,:config'(因爲你的班級不只是自己現在) – Tensibai
@Tensibai是的你是對的,那就是我試過的(我把它複製錯了)..但它不起作用。請參閱上面的更新代碼 –
由於「ModuleName :: Data.run」不存在,因此無法將':run'委託給'ModuleName :: Data'。你正在尋找定義'ModuleName :: Data.run'還是將調用委託給'ModuleName :: Data'的實例?通常在委派的情況下,你希望有一些動態的委託給 - 直接委派給單例方法是不常見的(因爲你已經有其他機制在代碼中建立靜態鏈接) –