2013-04-30 7 views
2

Обзор:Ruby: создавать объекты из файлов

main.rb 
items/ 
    one.rb 
    two.rb 
    three.rb 

Каждый файл в items/ должен иметь удобочитаемое описание (сериализации выходит), как и (но, возможно, DSL будет лучше?):

class One < BaseItem 
    name "Item one" 
    def meth 
     "something" 
    end 

main.rb должен иметь возможность создавать экземпляры всех объектов из каталога items/. Как это можно сделать? Не знакомый с Ruby, я вижу, что объектная модель допускает некоторые довольно классные вещи (те крючки класса и т. Д.), Но мне трудно найти способ решить эту проблему.

Любой способ ввода оценен.

EDIT:

Стреляй, я, возможно, пропустил его суть - то, что я не упомянул был материал в items/ директории будет динамическим - относиться к вещи как плагины, я хочу main.rb автоопределение все в этом каталоге во время выполнения (возможно, перезагрузка во время выполнения). main.rb не имеет предварительного знания объектов там, он просто знает, какие методы ожидать от них.

Я посмотрел на создание DSL, учитывая определение (в main.rb) функции spawn, которая принимает блок. Пример файл в items/ будет выглядеть примерно так:

spawn do 
    name "Item name" 
    def foo 
     "!" 
    end 
end 

И внутренности spawn бы создать новый объект базового типа и передать блок instance_eval. Это означало, что для установки значения мне понадобится метод name, но, кстати, я также хотел, чтобы значение было доступно под name, поэтому мне пришлось его переименовать в attr.

Я также пробовал маршрут наследования: сделайте каждый файл элемента содержащим класс, который наследуется от типа BaseItem, и подключайтесь к нему через inherited ... но это не сработало (крючок никогда не запускался, я теперь я потерял код).

EDIT2:

Вы можете посмотреть на то, что homebrew делает со своими формулами, что очень близко к тому, что я хочу - я просто не рубиновый доблесть перепроектировать, как она обрабатывает формулу.

+3

Вы не говорите, что ваши исследования в решении этого привели вас, и почему эти вещи не сработали для вас. Скажите нам, поэтому мы не получаем 20 вопросов. –

ответ

2

Все это сводится к требованию этих файлов и гарантирует, что вы внедрили в них функциональность.

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

0

Я не эксперт по сохранению объекта, но ответ на ваш конкретный вопрос заключается в том, что у вас есть 2 хороших варианта: один из них - YAML, а другой - сам Ruby: DSL, написанный вами или кем-то другим, и специфичный для вашей бизнес-логики.

Но я думаю, что более общий ответ потребует более систематического рассмотрения объекта сопротивления в Ruby. Например, ActiveRecord :: Base потомки сохраняются как таблицы базы данных. Есть и другие способы, которые я нашел, например. это http://stone.rubyforge.org/ by googling. Это тоже моя проблема, я столкнулся с тем же вопросом, что и вы в моей работе.

+0

Невозможно использовать YAML, потому что мне нужны методы, а не только атрибуты. Если я ничего не знаю о YAML, я не знаю. – maligree

+0

@maligree: Если это просто имена методов и простые аргументы, YAML может справиться с этим. Если вам нужно указать тела метода в вашем файле, то это DSL. –

+0

Да, это методы с телами. Но мне нравится идея YAML быть IDL, спасибо. Может быть, когда-то .. – maligree

0

Что вы просите о внешности и запахах, как обычный рубиновый скрипт.

class One < BaseItem 
    name "Item one" 
    def meth 
     "something" 
    end 

Мы бы закрыть определение класса с другим end заявления. name "Item one", вероятно, будет сделано внутри метода initialize, установив переменную экземпляра:

attr_reader :name 
def initialize(name) 
    @name = name 
end 

Обычно мы не будем называть папку «элементы», но вместо этого он будет «Lib», но в остальном, что вы говорите о очень нормальном и ожидаемом.

Мгновенное копирование всех элементов в папке легко осуществляется путем итерации содержимого папки, требующей файлов, и вызова метода new для этого элемента. Вы можете выяснить имя, отображая имя файла на имя класса, или путем инициализации экземпляра в конце файла:

one = One.new("item one") 

Вы можете следить за деталями, загруженных в массив или хэш, или просто оторвать их. Это зависит от вас, так как это ваш код.

Похоже, вы не пробовали писать какие-либо скрипты Ruby, иначе вы бы уже это выяснили. Обычные книги/документация по программированию Ruby могли бы охватить это. Как есть, вопрос сродни преждевременной оптимизации, и работа с языком дала бы вам ответ.

Смежные вопросы