OxL Справочник OxL
РусскийEnglish

4.6 Интерфейсы

oxl
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