Классы, методы и переменные в ruby - PullRequest
0 голосов
/ 28 апреля 2011

Я пытаюсь написать систему плагинов на 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, переменные доступны как:

pluginCleanup.name = "New Value"

Может кто-нибудь сказать мне, как я мог бы заставить код работать, как описано в примерах выше? Я просто хочу иметь возможность объявить новый экземпляр и вызвать:

pluginCleanup.info.name = "New Value"

Ответы [ 2 ]

2 голосов
/ 28 апреля 2011

Что вы думаете об этом?

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"
0 голосов
/ 29 апреля 2011

Я думаю, использование instance_eval может помочь, как в следующем примере

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

Вам придется немного адаптировать его к вашим потребностям, но я простопоказывая, что это возможно сделать.Дайте мне знать, если вы застряли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...