Роботы, плагины и скрипты к чату MyChat. Разработка альтернативных клиентов и различных утилит. Технические вопросы по программированию, замечания и предложения по развитию API
Аватара пользователя
ChimMAG
Вот небольшой код:
Код: Выделить всё
var sIP:string;
begin
   sIP:='192.168.78.186';
    mLogScript(IntToStr(length(sIP)),'');
    mLogScript(fetch(sIP,'.'),'');
    mLogScript(sIP,'');
end.
Вывод:
Код: Выделить всё
[13:21:46] (Log "Temp"): 14
[13:21:46] (Log "Temp"): 192
[13:21:46] (Log "Temp"): 168.78.186
[13:21:46] (Run "Temp"): Время выполнения скрипта: 4 мс
[13:21:46] (Run "Temp"): Скрипт выполнен успешно.
С первыми двумя строчками mLogScript нет вопросов - всё как и ожидается. Но третья строка выявляет совсем неожидаемое поведение - она не просто вырезает подстроку и выдаёт её в качестве значения функции, она изменяет значение самой изначальной строки! Просто нелогичность этого видна на примере процедуры delete - вот она изменяет саму строку, вырезая из неё лишнее. Но fetch - это ФУНКЦИЯ! У неё есть значение, результат... Сейчас получается просто дублирование - она и в качестве значения выдаёт результат и ещё оригинальную строку обрезает, хотя если надо последнее, то всегда можно указать
Код: Выделить всё
s:=fetch(s,y)

И да, в случае, если в качестве строки указана текстовая константа, то выдаётся ошибка:
Код: Выделить всё
mLogScript(IntToStr(length(sIP)),'');
mLogScript(fetch(sIP,'.'),'');
Первая строка как истинная функция обрабатывается нормально, а вторая - "[Error]: Variable Expected".
Аватара пользователя
Алексей Пикуров
Пожалуйста, прочитайте справку. Функция работает в точности, как и задумано.

Разница между Delete и Fetch очевидна. Больше того, это очень разные функции, у них разные задачи.

Я переношу тему в раздел вопросов о скриптах, никаких ошибок в функции Fetch нет.
Аватара пользователя
ChimMAG
"Возвращает "вырезанную" строку с первой позиции до разделителя." - это не тоже самое, что возвращает и заменяет исходную. Функция Copy тоже возвращает результат своей работы, но не заменяет исходную. Почему функция trim тоже не заменяет исходную переменную, хотя как раз в ней это более логично. И - разница между Delete и Fetch должна быть очевидной, а по факту они обе не функции, а процедуры, только у Delete это явно указано, а у Fetch - процедура, замаскированная под функцию. И по применению она горааааааздо ближе к delete, чем к какому-нибудь copy. Ну и последнее - простая логика подсказывает нелогичность дважды отдавать результат работы.
Аватара пользователя
Алексей Пикуров
Я не понимаю, о чём вы со мной спорите и что пытаетесь доказать. Fetch — функция, есть документация. Что вам ещё нужно? :)
Аватара пользователя
ChimMAG
Просто я лично вижу не соответствие между описанием, ожиданием работы (ну вот привык я, что функция возвращает результат работы, а не изменяет аргументы) и логикой использованием этой функции (по факту как функцией ей пользоваться... мягко говоря затруднительно, в отличие от других функций работы со строками). Но если вы как разработчики уверены, что всё нормально - ну ок, пусть будет так, вам виднее...
Аватара пользователя
Алексей Пикуров
Примите, как есть. В хелпе чётко описана механика работы этой функции.