samurai
23.Январь.2022 18:13:20
#102
точно, это же расширение. почему-то забыл про это… спасибо.
но с толку появление Incremental в списке действительно сбило.
и ещё такой вопрос
type
a = class
b: integer;
end;
begin
var c:= new a[1];
c.initialize;
c[0].b.print; // Ссылка на объект не указывает на экземпляр объекта.
end.
должно ли так происходить? разве .initialize;
не должен был вызвать конструктор c[0]? или я неправильно понимаю описание этого метода?
samurai
23.Январь.2022 18:33:12
#105
вот оно что. как-то это надо пометить тоже наверно…
этот метод часто мелькает в массивах из контролов winforms. в моём случае RadioButton.
в самописных классах его действительно не видно
Это баг анализатора кода, должно показывать всем типам массивов, потому что это метод типа System.Array
- базового класса массивов.
То что его позволяет вызывать для переменных, к которым он не подходит по типу - это проблема архитектуры System.Array
, этот метод не должен был быть объявлен общим методом всех массивов.
Компилятор такие вещи запрещать не должен. Если изощряться - можно сделать предупреждение. Но вообще, на сколько я понял, этот метод не должен вызываться из пользовательского кода. Его вызов должны вставлять компиляторы, которым он необходим.
samurai
13.Февраль.2022 13:28:38
#107
если лямбда возвращает boolean
, то необходимо ставить скобки, что бы она адекватно взаимодействовала с not
, иначе
Операция not не может быть применена к типу function(): boolean
begin
var y:= (): boolean -> true;
print(not y);
end.
так уже работает
begin
var y:= (): boolean-> true;
print(not y());
end.
это необходимость или недочёт?
1 лайк
Admin
14.Февраль.2022 08:02:15
#108
Нет, не баг ) Открыли - и закрыли. Для делегатов not не определён
opened 08:01AM - 14 Feb 22 UTC
closed 03:38PM - 14 Feb 22 UTC
```pascal
begin
var f: ()->integer := ()->1;
Print(f + f); // выводит 1…
Print(f and f); // ошибка
Print(not f); // ошибка
end.
```
samurai
14.Февраль.2022 15:56:53
#109
То есть скобки всё таки необходимы? Просто скобки, когда параметров нет это вообще несвойственная для pabc вещь и не совсем приятно их использовать если уже привык к их отсутствию. тем более странно увидеть их необходимость в таком месте. Понятно, что сама логика функциональных переменных накладывает некоторые ограничения, но нет ли риска дополнительно усложнить язык.
В общем это надо как минимум задокументировать в справке. Или там уже есть что-то на эту тему и я просто не нашёл?
1 лайк
Можно поставить not внутри лямбды:
begin
var y:= (): boolean -> not true;
print(y);
end.
ibond
14.Февраль.2022 19:46:38
#111
Да, нужны. Либо делайте так
begin
var y:= (): boolean -> true;
var b: boolean := y;
print(b);
end.
Делегат преобразуется в вызов функции только в особых случаях. В операциях не преобразуется.
1 лайк
samurai
15.Февраль.2022 12:52:52
#112
Так не годится. Функция может быть использована в нескольких логический операциях, среди которых not либо нужен, либо нет
Ну и в целом ответ уже есть. Видимо тут только документация
Admin
15.Февраль.2022 16:56:58
#113
У вас не функция. У вас - делегат, то есть указатель на функцию. Это другой тип
samurai
15.Февраль.2022 20:08:45
#114
Admin:
Это другой тип
Ну это понятно. Просто в данном случае они используются с одной целью. По этому, на мой взгляд, уместно такое небрежное название
Я хотел инвертировать boolean внутри for. Но почему-то не нашел способ инвертирования значения как в C#:
bool test = false;
test = !test;
В C# это пишется так, но при попытке использовать это в Pascal, компилятор показывает ошибку. Я нашел способ инвертировать её как:
w := w <> true;
Но я уверен что не запомню этот подход и придётся заново изобретать велосипед. Если какой-то другой способ?
Кстати, я проверял
w:=<>w;
компилятор выводит ошибку.
Обнв.
Оказывается можно использовать
w:= not w;
для этого
Логические операции в паскале пишутся так же как называются. То есть and
, or
, xor
и т.п. - в данном случае not
.
1 лайк
Да, только сейчас это пришло мне в голову.
samurai
14.Октябрь.2022 05:48:36
#119
Почему в данном коде
begin
var s:=[1,5,3]+[2,6,4]+[47,37,27];
Write(s);
end.
Вывод будет
{47,27,6,5,4,37,2,1,3}
Весь справка говорит, что
Процедура Write при выводе множества выводит все его элементы. Например,<…> при этом данные, если это возможно, будут отсортированы по возрастанию.
В случае set of integer
это невозможно?
Admin
15.Октябрь.2022 22:05:03
#120
Да, невозможно. Множество неотсортировано
1 лайк
samurai
09.Ноябрь.2022 19:22:19
#121
library lib;
interface
type
rec = record
end;
implementation
end.
тут для rec есть
public static bool op_Equality
и
public static bool op_Inequality
а они точно должны быть публичны? захламляют запись же
Так а как их с другого файла вызывать, если они не будут публичны?
samurai
10.Ноябрь.2022 10:30:56
#123
если это не внутренние функции, то почему они генерятся в таком виде? если это функции сравнения, то почему не
public static bool operator ==