Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Ruby: Общие вопросы > Свой аналог attr_accessor


Автор: CPlusPlusFAN 20.7.2010, 23:13
Здравствуйте.

Скажите, можно ли написать свой аналог attr, attr_accessor?
Ну например для массива:
Код

class MyClass

attrByIndex :array, :index

# чтобы это преобразовывалось к
def [] index
    @array[index]
end

end


Если так можно, то можно привести пример?
Интересует не обязательно массив, а просто такой вид генерации методов.

Автор: CPlusPlusFAN 21.7.2010, 01:40
У меня появились 2 варианта:
Код

class Class

# полностью динамичный
  def attrByIndex array, index
    throw ArgumentError unless array.class == Symbol && index.class == Symbol
    class_eval "def [] #{index}; @#{array}[#{index}]; end"
  end

end


и ещё один:
Код

class Class

# имхо, самый трушный
  def attrByIndex array, index
    throw ArgumentError unless array.class == Symbol && index.class == Symbol
    define_method(:'[]') { |index| instance_variable_get("@#{array}")[index] }
  end

end


если честно, у меня идеи появились только что, после прочтения литературы по метапрограммированию. Может у кого есть варианты красивее?

Автор: fell 21.7.2010, 12:15
не очень понятно, что он должен делать ? опишите подробно ...
а написать то можно все что угодно, attr_accessor это просто классовые макросы, которые конструируют 2 метода set и get.

Автор: CPlusPlusFAN 22.7.2010, 21:46
Ну, к примеру, передаёшь ему символы имени массива и индекса и он генерит метод доступа к элементу внутреннего массива.

Автор: fell 23.7.2010, 10:19
для массивов есть очень много всяких функций, в версии 1.9.2 вроде еще добавили. Вы посмотрите, может это уже есть в класса Array, в справочнике гляньте список функций.
А функция(макрос) attribute accessor, как следует из названия назначает(управляет) атрибуты класса. Если вам нужна обработка массивов это класс Array. Открываете класс и дописываете нужный вам функционал. Только открываете не исходники smile а ваш класс. 

Автор: source777 23.7.2010, 14:59
Цитата(CPlusPlusFAN @  21.7.2010,  01:40 Найти цитируемый пост)
Может у кого есть варианты красивее? 

Самый красивый вариант в данном случае не умножать сущности сверх меры, а attrByIndex - это вообще хз что, читабельность в десятки раз хуже, чем у оригинального кода, да ещё и конвенция по именованию нарушены. И нафига этому "макросу" передаётся имя параметра метода? Прям можно подумать, что ты - VBFAN...  smile 
В Ruby нет разницы между
Код

def [] index
    @array[index]
end

и
Код

def [] idx
    @array[idx]
end

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)