2013-08-28 8 views
0

Я хотел бы создать объект в Ruby, расширяя класс (например, в Homebrew):доморощенного в Руби

class Somepackage < Formula 
    version "2.8" 
    homepage "http://foo.bar.com/" 
end 

Однако я Руби вербовать и я могу» т найти способ, чтобы определить Formula класс, который будет соответствовать моим потребностям:

class Formula 
    attr_reader :version, :homepage 
    def self.version (version) 
     @version = version 
    end 
end 

это, очевидно, не работает:

Somepackage.version #=> nil 

(мне нужно это вернуть 2.8)

Я знаю, что это должно быть очень просто, но я пробовал различные комбинации и просто не могу этого сделать.

Update

Итак, благодаря ответу Серджио, окончательный вариант выглядит следующим образом:

def property(*properties) 
    properties.each do |prop| 
    self.class_eval("def self.#{prop}(#{prop} = nil); @#{prop} = #{prop} if #{prop}; @#{prop}; end") 
    end 
end 

class Formula 
    property :version, :homepage 
end 

class Somepackage < Formula 
    version "2.8" 
    homepage "http://foo.bar.com/" 
end 

ответ

2

Обратите внимание, что ваши attr_reader методы на уровне экземпляра. Чтобы позвонить им, вам нужно будет это сделать

Somepackage.new.version 

который явно не был вашим намерением. Вы можете рекламировать их до уровня такого класса:

Но вот проблема. Ваша вторая версия version перезаписывает version от attr_reader. В результате у вас есть метод, который может устанавливать значения, но не возвращаться. После некоторых экспериментов, вы в конечном итоге с чем-то вроде этого:

class Formula 
    def self.version(version = nil) 
    if version 
     @version = version 
    end 

    @version 
    end 
end 

class Somepackage < Formula 
    version "2.8" 
end 

Somepackage.version # => "2.8" 

Сделайте свою собственную версию для homepage. Или, еще лучше, написать метод, который генерирует эти методы, так что вы можете просто сделать

class Formula 
    property :version, :homepage 
end 
+0

После вашего совета, я написал метод метод-генератор и отправил свой источник в моем обновлении вопроса. Спасибо! :) –

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