std/options
SourceEditЭтот модуль реализует типы, которые инкапсулируют необязательное значение.
Значение типа Option[T] либо содержит значение x (представленное как some(x)) либо является пустым (none(T)).
Это может быть полезно, когда у вас есть значение, которое может быть присутствующим или отсутствующим. Отсутствие значения часто обозначается как nil, но это не всегда доступно, и не всегда является хорошим решением.
Основное использование
Начнём с примера: процедура, которая находит индекс символа в строке.
Пример:
import std/options
proc find(haystack: string, needle: char): Option[int] =
for i, c in haystack:
if c == needle:
return some(i)
return none(int) # This line is actually optional,
# because the default is empty
let found = "abc".find('c')
assert found.isSome and found.get() == 2Операция get, продемонстрированная выше, возвращает базовое значение или поднимает UnpackDefect, если значение отсутствует. Обратите внимание, что UnpackDefect наследуется от system.Defect и, следовательно, никогда не должно перехватываться. Вместо этого, полагайтесь на проверку, содержит ли опция значение с помощью процедур isSome и isNone. Обработка по образцу
fusion/matching поддерживает обработку по образцу для Option, с шаблонами Some(<pattern>) и None().
{.experimental: "caseStmtMacros".}
import fusion/matching
case some(42)
of Some(@a):
assert a == 42
of None():
assert false
assertMatch(some(some(none(int))), Some(Some(None()))) Импорты
- typetraits
Типы
Процедуры
proc `$`[T](self: Option[T]): string
- Получить строковое представление
Option.Пример:
assert $some(42) == "some(42)" assert $none(int) == "none(int)"
Исходный код Редактировать proc `==`[T](a, b: Option[T]): bool {.inline.}- Возвращает
true, если обаOptionявляютсяnone, или если они обаsomeи имеют равные значения.Пример:
let a = some(42) b = none(int) c = some(42) d = none(int) assert a == c assert b == d assert not (a == b)
Исходный код Редактировать proc filter[T](self: Option[T]; callback: proc (input: T): bool): Option[T] {. inline, effectsOf: callback.}-
Применяет
callbackк значениюOption.Если
callbackвозвращаетtrue, опция возвращается какsome. Если возвращаетfalse, она возвращается какnone.См. также:
Пример:
proc isEven(x: int): bool = x mod 2 == 0 assert some(42).filter(isEven) == some(42) assert none(int).filter(isEven) == none(int) assert some(-11).filter(isEven) == none(int)
Исходный код Редактировать proc flatMap[T, R](self: Option[T]; callback: proc (input: T): Option[R]): Option[ R] {.inline, effectsOf: callback.}-
Применяет функцию
callbackк значениюOptionи возвращает новое значение.Если
Optionне имеет значения, возвращаетсяnone(R).Аналогично
map, с разницей в том, чтоcallbackвозвращаетOption, а не простое значение. Это позволяет объединять несколько процедур с сигнатуройA -> Option[B].См. также:
Пример:
proc doublePositives(x: int): Option[int] = if x > 0: some(2 * x) else: none(int) assert some(42).flatMap(doublePositives) == some(84) assert none(int).flatMap(doublePositives) == none(int) assert some(-11).flatMap(doublePositives) == none(int)Исходный код Редактировать proc flatten[T](self: Option[Option[T]]): Option[T] {.inline.}-
Удалить один уровень структуры вложенного
Option.См. также:
Пример:
assert flatten(some(some(42))) == some(42) assert flatten(none(Option[int])) == none(int)
Исходный код Редактировать proc get[T](self: Option[T]): lent T {.inline.}-
Возвращает содержимое
Option. Если оно не содержит значения, генерируется исключениеUnpackDefect.См. также:
- get proc со значением по умолчанию
Пример:
assert some(42).get == 42 doAssertRaises(UnpackDefect): echo none(string).get
Исходный код Редактировать proc get[T](self: Option[T]; otherwise: T): T {.inline.}- Возвращает содержимое
Optionилиotherwise, еслиOptionне содержит значения.Пример:
assert some(42).get(9999) == 42 assert none(int).get(9999) == 9999
Исходный код Редактировать proc get[T](self: var Option[T]): var T {.inline.}- Возвращает содержимое
var Optionв изменяемой форме. Если оно не содержит значения, генерируется исключениеUnpackDefect.Пример:
var a = some(42) b = none(string) inc(a.get) assert a.get == 43 doAssertRaises(UnpackDefect): echo b.get
Исходный код Редактировать proc isNone[T](self: Option[T]): bool {.inline.}-
Проверяет, пуста ли
Option.См. также:
Пример:
assert not some(42).isNone assert none(string).isNone
Исходный код Редактировать proc isSome[T](self: Option[T]): bool {.inline.}-
Проверяет, содержит ли
Optionзначение.См. также:
Пример:
assert some(42).isSome assert not none(string).isSome
Исходный код Редактировать proc map[T, R](self: Option[T]; callback: proc (input: T): R): Option[R] {. inline, effectsOf: callback.}-
Применяет функцию
callbackк значениюOptionи возвращаетOptionс новым значением.Если
Optionне имеет значения, возвращаетсяnone(R).См. также:
- map proc
- flatMap proc для варианта с обратной функцией, возвращающей
Option
Пример:
proc isEven(x: int): bool = x mod 2 == 0 assert some(42).map(isEven) == some(true) assert none(int).map(isEven) == none(bool)
Исходный код Редактировать proc map[T](self: Option[T]; callback: proc (input: T)) {.inline, effectsOf: callback.}-
Применяет функцию
callbackк значениюOption, если оно есть.См. также:
- map proc для варианта с обратной функцией, возвращающей значение
Пример:
var d = 0 proc saveDouble(x: int) = d = 2 * x none(int).map(saveDouble) assert d == 0 some(42).map(saveDouble) assert d == 84
Исходный код Редактировать proc none(T: typedesc): Option[T] {.inline.}-
Возвращает
Optionдля данного типа, не содержащего значения.См. также:
Пример:
assert none(int).isNone
Исходный код Редактировать proc none[T](): Option[T] {.inline.}- Псевдоним для none(T). Исходный код Редактировать
proc option[T](val: sink T): Option[T] {.inline.}-
Может использоваться для преобразования типа указателя (
ptr,pointer,refилиproc) в тип опции. Преобразуетnilвnone(T). ЕслиTне является типом указателя, это эквивалентноsome(val).См. также:
Пример:
type Foo = ref object a: int b: string assert option[Foo](nil).isNone assert option(42).isSomeИсходный код Редактировать proc some[T](val: sink T): Option[T] {.inline.}-
Возвращает
Optionсо значениемval.См. также:
Пример:
let a = some("abc") assert a.isSome assert a.get == "abc"Исходный код Редактировать proc unsafeGet[T](self: Option[T]): lent T {.inline.}-
Возвращает значение
some. Поведение не определено дляnone.Примечание: Используйте только в том случае, если вы абсолютно уверены, что значение присутствует (например, после проверки с помощью isSome). В целом, предпочтительно использовать get proc.
Исходный код Редактировать
© 2006–2024 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/options.html