4.6 Интерфейсы
pub(api) interface Storage {
fn get(k: str) -> bytes? io
var fn put(k: str, v: bytes) io
fn has(k: str) -> bool io => get(k) != none // метод по умолчанию
}
interface ReadWrite { embed Reader; embed Writer }
interface Container<T> { type Item = T; fn items() -> iter<T> }
@explicit interface Persistent { fn key() -> str }
assert FileStorage: Storage // статическая проверка- Интерфейсы структурные: тип
TудовлетворяетI, если для каждого методаIбез реализации по умолчанию уTесть метод с тем же именем, совместимым получателем (&self⊂&var self), теми же типами параметров, тем же или более узким возвращаемым типом и эффектами, входящими в эффекты метода интерфейса. - Методы по умолчанию добавляются типу при использовании через интерфейс; собственный метод типа имеет приоритет.
@explicit interfaceудовлетворяется только явнымimpl I for Tили@derive(I).- Использование: как ограничение дженерика (
T: Storage, статическая диспетчеризация) или как типdyn Storage(динамическая, через vtable).
Стандартные интерфейсы:
| Интерфейс | Явный | Назначение | derive |
|---|---|---|---|
Copy | да | копирование вместо перемещения (§3.9) | да |
Clone | нет | clone() | да |
Drop | да | деструктор | нет |
Eq | нет | ==, != | да |
Ord | нет | <=> и сравнения | да |
Hash | нет | ключи Map/Set | да |
Show | нет | интерполяция, логи | да |
Default | нет | T.default() | да |
Serializable | да | сериализация (§9) | автоматически для data/enum |
Iterable<T> | нет | источник для for | — |
Streamable<T> | нет | источник для for await | — |
Middleware | да | обработчик rpc-атрибутов (§10.2) | — |
Связанные диагностики
explicit-interface, interface-not-satisfied
См. также
Исходник: docs/spec/oxl-standard.md