Как я могу найти массив объектов Ruby Maglev?
Как я могу найти массив объектов maglev? Маглев великолепен, но, похоже, у него нет никаких возможностей для запросов. Для этого есть внешние библиотеки?
3 ответа
Базовая версия MagLev VM уже давно поддерживает индекс. Пример индексации и запроса коллекции в http://github.com/MagLev/maglev/tree/master/examples/persistence/indexing/
Нам пришлось отключить индексирование на некоторое время, но мы включим его с обновленным примером в следующем выпуске (возможно, через несколько дней).
Я понимаю, что уже немного поздно, но...
Во-первых, нет такой вещи, как "массив MagLev", это просто массив Ruby. Поскольку это просто массив Ruby, вы можете использовать Array#select
а также Array#detect
, Как сказал Питер, есть встроенная индексация (которая была снова включена), но индексация доступна только для неупорядоченных коллекций.
Maglev 1.0.0 имеет IdentitySet
теперь это может стать довольно мощным механизмом запросов с многоатрибутным поиском и ведением индексов, однако на данный момент он не очень "похож на Ruby". Вам нужно будет определить все атрибуты, для которых вы когда-либо захотите определить индекс, когда вы впервые определите свой класс, используя статический метод self.__fixed_instvars :@inst_var1, :@inst_var2, ...
который будет вызывать исключение, когда он вызывается во второй раз (поэтому вам нужно добавить отдельную защиту, которая препятствует его запуску при повторной загрузке класса).
Это кажется понятным с точки зрения Smalltalk, когда классы имеют версии и остаются статичными, однако это не совсем соответствует ситуации Маглева с одним "текущим" определением класса, которое развивается со временем.
Если ваша задача на самом деле просто запросить массив, вы всегда можете прибегнуть к Ruby-методу выбора, который реализован для большинства структур данных, но обычно он работает, просто обходя все объекты и не используя индексы.