我正在尝试在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时,varibles可以访问:
pluginCleanup.name = "New Value"
有人可以告诉我如何使代码工作,如上面的例子所述?我只想宣布一个新实例并致电:
pluginCleanup.info.name = "New Value"
答案 0 :(得分: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"
答案 1 :(得分: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
你必须根据自己的需要调整一下,但我只是表明它可以做到。如果你遇到困难,请告诉我。