2015-07-29 9 views
0

Я хочу, чтобы закодировать следующую логическую структуру:В Ruby, могу ли я создать Struct внутри Struct?

category 
    name 
    description 
    fields 

field 
    name 
    description 

Я использую жидкие капли для этого. Так что, если у меня есть:

class FieldDrop < liquid::Drop 
    def initialize(field) 
    @field = field 
    end 
    def name 
    @field.name 
    end 
    def description 
    @field.description 
    end 
end 

тогда как я могу получить класс CategoryDrop для ссылки на FieldDrop в его методе def fields?

Моя структура является:

Category = Struct.new(:name, :description, :fields) 

на основе CategoryDrop где

def fields 
    @category.fields 
end 

Я хочу def fields расширить в @ field.name + '' + @ field.description для каждого поля.

+0

Что вы подразумеваете под «структурой внутри структуры»? Ruby не имеет ровно структур. – iamnotmaynard

+0

@iamnotmaynard Не уверен, что это то, чего хочет OP, но у Ruby есть структуры. http://ruby-doc.org/core-2.2.2/Struct.html –

+0

Ах, я вижу. Я видел их раньше, но забыл. Я думал о структурах C-стиля. – iamnotmaynard

ответ

0

По именованию и описание вашего вопроса, это звучит, как вы хотели коллекцию или список StructStruct внутри других, а не просто Struct в Struct.

Определить Category-структуру:

Struct.new('Category', :name, :description, :fields) 
=> Struct::Category 

определить Field-структуру:

Struct.new('Field', :name, :description) 
=> Struct::Field 

При создании Category экземпляр, он может иметь массив для fields элемента, который может первоначально быть пустым :

@category = Struct::Category.new('Foo', 'This is a foo', Array.new) 
=> #<struct Struct::Category name="Foo", description="This is a foo", fields=[]> 

Затем добавить несколько полей @category:

@category.fields << [ 'Field 1', "This is field 1" ] 
@category.fields << [ 'Field 2', 'This is field 2' ] 
... 

Тогда ваши поля отображения метод может выглядеть следующим образом:

def fields 
    @category.fields.each { |f| puts f.name + ' ' + f.description } 
end 

Или все, что вы хотите делать с полями.

+0

@ user962915 приветствую вас. Если вы найдете мой ответ приемлемым, если вы можете быть любезны проверить флажок «принять», чтобы указать ваше согласие, я был бы признателен. Спасибо. – lurker

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