ruby中的类,方法和变量

时间:2011-04-28 05:55:28

标签: 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时,varibles可以访问:

pluginCleanup.name = "New Value"

有人可以告诉我如何使代码工作,如上面的例子所述?我只想宣布一个新实例并致电:

pluginCleanup.info.name = "New Value"

2 个答案:

答案 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

你必须根据自己的需要调整一下,但我只是表明它可以做到。如果你遇到困难,请告诉我。