2013-08-02 78 views
0

我正在使用Ruby的元編程方法在類中創建一堆方法。在類OmekaItem內有一大堆這種形式dc_titledc_subject的方法,並且有一大堆這種形式的方法itm_field1itm_field2。我想更好地將這些方法分組。理想的情況下,給定一個名爲item的類的實例,我想調用的方法是這樣的:Ruby類中的命名空間方法

  • item.dublin_core.title
  • item.item_type_metadata.field

等。有沒有辦法做到這一點?

This question有我正在使用的代碼。

+0

只要'item.dublin_core'返回一個具有'title'方法的對象,就可以工作。您需要將dublin_core(和相關狀態)的所有方法分組到不同的類中,並且OmekItem中的狀態將是dublin_core類實例。 – SteveTurczyn

回答

1

會像下面的東西爲你工作?

class OmekaItem 
    class DublinCore 
    def initialize(omeka_item) 
     @omeka_item = omeka_item 
    end 

    def title 
     @omeka_item.dc_title 
    end 

    def subject 
     @omeka_item.dc_subject 
    end 
    end 

    class ItemTypeMetadata 
    def initialize(omeka_item) 
     @omeka_item = omeka_item 
    end 

    def field1 
     @omeka_item.itm_field1 
    end 

    def field2 
     @omeka_item.itm_field2 
    end 
    end 

    def dublin_core 
    @dublin_core ||= DublinCore.new(self) 
    end 

    def item_type_metadata 
    @item_type_metadata ||= ItemTypeMetadata.new(self) 
    end 
end 

DublinCoreItemTypeMetadata的方法可使用define_method適當地動態生成的。

+0

謝謝,這正是我需要的。正如你所建議的那樣,我使用'define_method'來定義'DublinCore'類的實際方法。我想我會很難讓'DublinCore'方法回溯到創建它的對象,這是完整的一點。但是'object_id's是一樣的,所以它沒有任何進一步的改變。紅寶石魔法! –