Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Свой аналог attr_accessor 
:(
    Опции темы
CPlusPlusFAN
Дата 20.7.2010, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 1.11.2005
Где: Воронеж

Репутация: нет
Всего: нет



Здравствуйте.

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

class MyClass

attrByIndex :array, :index

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

end


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

Это сообщение отредактировал(а) CPlusPlusFAN - 20.7.2010, 23:14
PM MAIL ICQ Jabber   Вверх
CPlusPlusFAN
Дата 21.7.2010, 01:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 1.11.2005
Где: Воронеж

Репутация: нет
Всего: нет



У меня появились 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


если честно, у меня идеи появились только что, после прочтения литературы по метапрограммированию. Может у кого есть варианты красивее?
PM MAIL ICQ Jabber   Вверх
fell
Дата 21.7.2010, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.12.2008
Где: Санкт-Петербург

Репутация: нет
Всего: нет



не очень понятно, что он должен делать ? опишите подробно ...
а написать то можно все что угодно, attr_accessor это просто классовые макросы, которые конструируют 2 метода set и get.
PM MAIL WWW   Вверх
CPlusPlusFAN
Дата 22.7.2010, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 1.11.2005
Где: Воронеж

Репутация: нет
Всего: нет



Ну, к примеру, передаёшь ему символы имени массива и индекса и он генерит метод доступа к элементу внутреннего массива.
PM MAIL ICQ Jabber   Вверх
fell
Дата 23.7.2010, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.12.2008
Где: Санкт-Петербург

Репутация: нет
Всего: нет



для массивов есть очень много всяких функций, в версии 1.9.2 вроде еще добавили. Вы посмотрите, может это уже есть в класса Array, в справочнике гляньте список функций.
А функция(макрос) attribute accessor, как следует из названия назначает(управляет) атрибуты класса. Если вам нужна обработка массивов это класс Array. Открываете класс и дописываете нужный вам функционал. Только открываете не исходники smile а ваш класс. 
PM MAIL WWW   Вверх
source777
Дата 23.7.2010, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 6
Всего: 56



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

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

def [] index
    @array[index]
end

и
Код

def [] idx
    @array[idx]
end



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Ruby: Общие вопросы"
source777
  • С чего начать? начинаем
  • Ссылки на полезные ресурсы смотрим тут
  • Обязательно следуйте правилам Vingrad.
  • Пожалуйста, прочитайте рекомендации по работе в форуме и навигации по Vingrad.
  • Для вставки кодов Ruby используйте тег: [code=ruby]код[/code]. Когда в будущем подсветка синтаксиса для Ruby будет реализована, весь исходных код преобразится.
  • Используйтe чекбокс "Транслит" (возле кнопок кодов), если у Вас нет русских шрифтов.
  • Помните, для каждого вопроса должна быть своя тема.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, source777.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Ruby: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1576 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.