LINUX.ORG.RU

get name of class when calling super

 ,


0

0

сразу извиняюсь за заглавие на буржуйском. как искал в гугле - так и скопипастил сюда

есть код

class A
  def initialize()
    p 'in A#init:' + self.class.name
  end
end
class B < A
  def initialize()
    p 'in B#init:' + self.class.name
    super
  end
end

output

«in B#init:B» «in A#init:B»

а что нужно исправить чтобы получить «правильную» 2ю строчку?

★★★★★

Кэп подсказывает:

class A
  def initialize()
    p 'in A#init:' + A.name
  end
end

...

Что ты вообще хочешь сделать? Можно не сентетический пример?

anonymous
()
Ответ на: комментарий от korvin_

а если цепочка наследования составляєт 10 классов то...

то нужно писать

self.class.superclass.superclass.superclass.superclass.superclass.superclass.superclass.superclass.superclass.superclass.superclass.superclass.name ?

да?

ZuBB ★★★★★
() автор топика
Ответ на: комментарий от ZuBB

Все еще не понимаю чего тебе надо. Объясни нормально словами. В частности, чем тебе не понравилось «p 'in A#init:' + A.name». Если метод должен знать, в каком классе он определен, то в нем надо просто прописать название этого класса. Так всегда и делают.

self.class.superclass.superclass.superclass.superclass.superclass.superclass.superclass.superclass.superclass.superclass.superclass.superclass.name

Можно проманкипатчить Class и добавить в него метод nth_superclass, тогда можно будет писать что-то типа nth_superclass(100500). Другой вопрос что ты хочешь чего-то странного. Если все делать нормально, то необходимости в таких извратах не будет.

можна

Зачем в Category::initialize ты вызываешь FSobject::initialize два раза? Сначала по цепочке «super(Repository.create_init_params(params))», затем напрямую «FSobject.instance_method(:initialize).bind(self).call(...)».

anonymous
()
Ответ на: комментарий от anonymous

nth_superclass(100500)

Точнее self.class.nth_superclass(100500)

anonymous
()
Ответ на: комментарий от anonymous

прежде всего спасибо за ответ.

проманкипатчить..

я хз что это такое. в зависимости от того что это такое, мое мнение может быть следующим: не хочу городить костыли для решения проблем, которые должны быть решены иначе (вожможно, что я еще не знаю правильного пути) или я буду оставать с апстримом ruby настолько долго, насколько это возможно

Зачем в Category::initialize ты вызываешь FSobject::initialize два раза? Сначала по цепочке «super(Repository.create_init_params(params))», затем напрямую «FSobject.instance_method(:initialize).bind(self).call(...)».

потому что обьекты класса Category это прежде всего обьекты в ФС - «/usr/portage/sys-fs/» (2й вызов FSobject::initialize). А родитель класса Category - Repository. И он тоже описывает обьекты в ФС - «/usr/portage/» или «/var/lib/layman/wavilen/» (1й вызов).

Сейчас после ~2х недель (столько времени прошло с момента написания того поста) имеется следующая мисль: классы FSobject, DBobject, GPobject переделать в модули и уже инклудить их. Но это лишь частично решает проблемму.

ZuBB ★★★★★
() автор топика
Ответ на: комментарий от ZuBB

я хз что это такое

class Class
  def nth_superclass(n)
    n == 0 ? self : superclass.nth_superclass(n - 1)
  end
end

class A
end

class B < A
end

class C < B
end

p C.nth_superclass(1)
p C.nth_superclass(2)
p C.nth_superclass(3)

потому что обьекты класса Category это прежде всего обьекты в ФС - «/usr/portage/sys-fs/» (2й вызов FSobject::initialize). А родитель класса Category - Repository. И он тоже описывает обьекты в ФС - «/usr/portage/» или «/var/lib/layman/wavilen/» (1й вызов).

Стоп. Ты унаследовал категорию от репозитория только потому, что он ее содержит? Это тоже самое, что наследовать книгу от книжного шкафа. Наследование нужно чтобы отражать связь «X является разновидностью Y». У тебя получается что категории и пакеты (последние опосредованно через класс Category) являются разновидностью репозиториев, а это бред. Для связи «X содержит в себе Y» в программировании используются совсем другие механизмы. Ни gentoo, ни portage даже издалека не видел, по этому что-то конкретное по архитектуре программы посоветовать не могу. Могу тебе посоветовать только читать книги по объектно ориентированному проектированию, и потолще.

anonymous
()
Ответ на: комментарий от anonymous

ну ок. возможно здесь перебор. а что делать с category -> package, или package -> ebuild

vv@crusader ~ $ ls -l /usr/portage/app-antivirus/
total 8
drwxr-xr-x 3 portage portage 4096 тра  2 23:31 clamav
-rw-r--r-- 1 portage portage 1265 лют 17  2006 metadata.xml
vv@crusader ~ $ ls -l /usr/portage/app-antivirus/clamav/
total 84
-rw-r--r-- 1 root    root    61077 тра  2 23:31 ChangeLog
-rw-r--r-- 1 root    root     3625 тра  2 23:31 clamav-0.97.3.ebuild
-rw-r--r-- 1 root    root     3632 тра  2 23:31 clamav-0.97.4.ebuild
drwxr-xr-x 2 portage portage  4096 січ 31 15:41 files
-rw-r--r-- 1 root    root     2134 тра  2 23:31 Manifest
-rw-r--r-- 1 portage portage   320 кві  3  2009 metadata.xml
vv@crusader ~ $ ls -l /usr/portage/app-antivirus/clamav/clamav-0.97.3.ebuild 
-rw-r--r-- 1 root root 3625 тра  2 23:31 /usr/portage/app-antivirus/clamav/clamav-0.97.3.ebuild
vv@crusader ~ $ 

здесь тоже книга<-шкаф? есть пакеты, которые доступны только в оверлеях (не основном репозитории) отсюда и связь repo->category->package->ebuild

ZuBB ★★★★★
() автор топика
Ответ на: комментарий от ZuBB

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

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.