LINUX.ORG.RU

История изменений

Исправление quantum-troll, (текущая версия) :

Без учёта ограничений он реализован корректно: контрвариативно по аргументам, ковариативно по возвращаемому значению.

Судя по возможности «забывателя»

Ничего там не забывается. Это всего лишь трюк для того, чтобы вызвать сабтайпинг вместо простой унификации.
Когда тайпчекер унифицирует трюк не проходит:

forall 'a, 'b, T; &'a &'b (), &'b T -> &'a T where 'b <: 'a
'a = 'static
-----
Ошибка, 'b <: 'static выполняется лишь в случае, когда 'b = 'static


Однако сабтайпинг без ограничений приводит к фейлу:

&'static &'static <: &'static &'b
-----
fn(&'static &'b) <: fn(&'static &'static)

Исправление quantum-troll, :

Без учёта ограничений он реализован корректно: контрвариативно по аргументам, ковариативно по возвращаемому значению.

Судя по возможности «забывателя»

Ничего там не забывается. Это всего лишь трюк для того, чтобы вызвать сабтайпинг вместо простой унификации.
Когда тайпчекер унифицирует трюк не проходит:

forall 'a, 'b, T; &'a &'b (), &'b T -> &'a T where 'b <: 'a
'a = 'static
-----
Ошибка, 'b <: 'a выполняется лишь в случае, когда 'b = 'static


Однако сабтайпинг без ограничений приводит к фейлу:

&'static &'static <: &'static &'b
-----
fn(&'static &'b) <: fn(&'static &'static)

Исходная версия quantum-troll, :

Без учёта ограничений он реализован корректно: контрвариативно по аргументам, ковариативно по возвращаемому аргументу.

Судя по возможности «забывателя»

Ничего там не забывается. Это всего лишь трюк для того, чтобы вызвать сабтайпинг вместо простой унификации.
Когда тайпчекер унифицирует трюк не проходит:

forall 'a, 'b, T; &'a &'b (), &'b T -> &'a T where 'b <: 'a
'a = 'static
-----
Ошибка, 'b <: 'a выполняется лишь в случае, когда 'b = 'static


Однако сабтайпинг без ограничений приводит к фейлу:

&'static &'static <: &'static &'b
-----
fn(&'static &'b) <: fn(&'static &'static)