2011-04-28 68 views
0

我正試圖在ruby中編寫一個插件系統,我遇到了一些麻煩,從未學過一套好的基礎知識。無論如何,我的插件系統只是一個使用類的實驗。我的插件類看起來是這樣的:ruby​​中的類,方法和變量

class Plugin 
    def info 
    # Set some default values when a new class is created. 
    name = "Test Plugin" 
    description = "Just a simple test plugin." 
    version = "1.0" 
    end 
end 

在一個插件我會要求上述文件,並編寫一些代碼,像這樣:

require "./_plugin_base.rb" 

pluginCleanup = Plugin.new 

pluginCleanup.info do 
    name = "Cleanup" 
    description = "Remove the files we don't need in the public folder." 
    version = "1.0" 
end

現在,我知道這個代碼不工作。基本上我想我想要的是info方法下的實例變量。我一直在使用真實的實例變量試圖和他們做的工作很好,但是我要保留這些info函數裏面,如果讓任何意義,因爲當我使用attr_accessor的可變因素是accessable爲:

pluginCleanup.name = "New Value"

可有人告訴我如何讓代碼按照上述示例中的描述工作?我只是想能夠申報一個新實例並致電:

pluginCleanup.info.name = "New Value"

回答

2

您對此有何看法?

class Plugin 
    def initialize 
    @info = PluginInfo.new 
    end 

    attr_reader :info 
end 

class PluginInfo 
    def initialize 
    # Set some default values when a new class is created. 
    @name = "Test Plugin" 
    @description = "Just a simple test plugin." 
    @version = "1.0" 
    end 

    attr_accessor :name, :description, :version 
end 

plugin_cleanup = Plugin.new 
#=> #<Plugin:0x000000024f0c48 @info=#<PluginInfo:0x000000024f0c20 @name="Test Plugin", @description="Just a simple test plugin.", @version="1.0">> 
plugin_cleanup.info.name 
#=> "Test Plugin" 
plugin_cleanup.info.name = "A New Plugin" 
#=> "A New Plugin" 
plugin_cleanup.info.name 
#=> "A New Plugin" 
+2

命名空間的好應用:'Plugin'和'Plugin :: Info' – zetetic 2011-04-28 06:38:06

+0

嗯,看起來不錯,我會試着看看我是否可以使用像zetetic這樣的命名空間。 – 2011-04-28 14:35:44

0

我想用instance_eval可能會有幫助,像following example

class Panda 
    def self.feed(&block) 
    panda = Panda.new 
    panda.instance_eval(&block) 
    end 

    def nom(food) 
    puts "nomming #{food}" 
    end 
end 

Panda.feed do 
    nom :bamboo 
    nom :chocolate 
end 

你必須有點適應它您的需求,但我只是表明這是可能做到這一點。讓我知道如果你卡住了。