Можно ли упростить конструкцию вида:
if (Me.location = room1 or Me.location = room2 or ...)
?
Например, быстро проверив принадлежность объекта Me.location к списку комнат?
Способ с циклом очевиден, но, может быть, язык предлагает лучший инструмент?
Заранее извиняюсь, если вопрос глупый.
Спасибо
Отредактировано Hind (24.10.2007 16:40)
Неактивен
В общем, пока решил проблему созданием пустого класса, а нужные комнаты сделал потомками в том числе этого класса... Конкретно в моем случае нужно было проверять радиодосягаемость, скажем так, жучка )
radioroom: room
;
...
if (isclass (Me.location, radioroom)
...
Но ответ о средствах языка хотелось бы все же услышать
Неактивен
Hind написал:
Можно ли упростить конструкцию вида:
if (Me.location = room1 or Me.location = room2 or ...)
?
Например, быстро проверив принадлежность объекта Me.location к списку комнат?
Способ с циклом очевиден, но, может быть, язык предлагает лучший инструмент?
Имеется встроенная функция find
, которая ищет элемент в списке или подстроку в строке и возвращает порядковый номер элемента в списке (или nil
, если он не найден).
В Вашем случае оно могло бы работать так:
local RoomList; RoomList:=[room1 room2 room3 room4 room5 room6] if(find(RoomList, MyRoom)<>nil) {... }
При этом, если MyRoom равна room3, функция вернет 3, а если MyRoom отсутствует в RoomList, то nil.
Hind написал:
Заранее извиняюсь, если вопрос глупый.
Эх... Хотел было побрюзжать на тему "читайте мануал, господа", но вспомнил, что эта глава еще не переведена;).
Неактивен
Ага, спасибо! Проблема была именно с неизвестностью названия функции, а читать на инглише весь ман по языку таки утомительно...
find
Call: find(value, target)
If value is a list; the function returns the offset (starting at 1 for the first element) in the list of the target item within the value list. If the target is not found, nil is returned. For example, find([4 5 6], 5) returns 2.
Неактивен
Лично мне вариант решения проблемы с помощью наследования кажется естественнее. Такой подход используется повсеместно в библиотеке adv.t, и я пользуюсь именно таким подходом. Только для проверки использую не is_class (), а флаг в родительском классе, и его проверку:
radioroom: room isRadioroom = true; ; if (parserGetMe().location.isRadioroom) ...
По умолчанию все неописанные свойства объекта имеют значения nil.
Отредактировано Gremour (28.10.2007 15:02)
Неактивен
Gremour написал:
Лично мне вариант решения проблемы с помощью наследования кажется естественнее.
В данном конкретном случае да, но есть задачи, которые удобнее решать именно проверкой списка, и вот тут-то функция find крайне полезна...
Неактивен