options
Этот модуль реализует типы, которые инкапсулируют необязательное значение.
Значение типа Option[T] либо содержит значение x (представленное как some(x)) либо пусто (none(T)).
Это может быть полезно, когда у вас есть значение, которое может присутствовать или отсутствовать. Отсутствие значения часто обозначается nil, но оно не всегда доступно, и не всегда является хорошим решением.
Основные примеры использования
Начнём с примера: процедура, которая находит индекс символа в строке.
import 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.
Как обработать отсутствие значения:
let result = "team".find('i')
# Nothing was found, so the result is `none`.
assert(result == none(int))
# It has no value:
assert(result.isNone) Импорты
- typetraits
Типы
Option[T] = object when T is SomePointer: val else: val has- Необязательный тип, который хранит своё значение и состояние раздельно в булевом значении. Исходный код Редактировать
UnpackDefect = object of Defect
- Исходный код Редактировать
UnpackError {...}{.deprecated: "See corresponding Defect".} = UnpackDefect- Исходный код Редактировать
Процедуры
proc option[T](val: T): Option[T] {...}{.inline.}-
Можно использовать для преобразования типа указателя (
ptrилиrefилиproc) в тип опции. Он преобразуетnilвNone.См. также:
Пример:
type Foo = ref object a: int b: string var c: Foo assert c.isNil var d = option(c) assert d.isNoneИсходный код Редактировать proc some[T](val: T): Option[T] {...}{.inline.}-
Возвращает
Option, имеющую значениеval.См. также:
Пример:
var a = some("abc") b = some(42) assert $type(a) == "Option[system.string]" assert b.isSome assert a.get == "abc" assert $b == "Some(42)"Исходный код Редактировать proc none(T: typedesc): Option[T] {...}{.inline.}-
Возвращает
Optionдля данного типа без значения.См. также:
Пример:
var a = none(int) assert a.isNone assert $type(a) == "Option[system.int]"
Исходный код Редактировать proc none[T](): Option[T] {...}{.inline.}- Псевдоним для none(T) proc. Исходный код Редактировать
proc isSome[T](self: Option[T]): bool {...}{.inline.}- Проверяет, содержит ли
Optionзначение.Пример:
var a = some(42) b = none(string) assert a.isSome assert not b.isSome
Исходный код Редактировать proc isNone[T](self: Option[T]): bool {...}{.inline.}- Проверяет, пуста ли
Option.Пример:
var a = some(42) b = none(string) assert not a.isNone assert b.isNone
Исходный код Редактировать proc get[T](self: Option[T]): lent T {...}{.inline.}-
Возвращает содержимое
Option. Если оноNone, выбрасывается исключение.См. также:
- get proc со значением по умолчанию
Пример:
let a = some(42) b = none(string) assert a.get == 42 doAssertRaises(UnpackDefect): echo b.get
Исходный код Редактировать proc get[T](self: Option[T]; otherwise: T): T {...}{.inline.}- Возвращает содержимое
Optionили значениеotherwiseеслиOptionявляетсяNone.Пример:
var a = some(42) b = none(int) assert a.get(9999) == 42 assert b.get(9999) == 9999
Исходный код Редактировать proc get[T](self: var Option[T]): var T {...}{.inline.}- Возвращает содержимое
var Option. Если оноNone, выбрасывается исключение.Пример:
let a = some(42) b = none(string) assert a.get == 42 doAssertRaises(UnpackDefect): echo b.get
Исходный код Редактировать proc map[T](self: Option[T]; callback: proc (input: T)) {...}{.inline.}-
Применяет функцию
callbackк значениюOption, если оно есть.См. также:
- map proc для версии с обратной функцией, возвращающей значение
- filter proc
Пример:
var d = 0 proc saveDouble(x: int) = d = 2*x let a = some(42) b = none(int) b.map(saveDouble) assert d == 0 a.map(saveDouble) assert d == 84
Исходный код Редактировать proc map[T, R](self: Option[T]; callback: proc (input: T): R): Option[R] {...}{. inline.}-
Применяет функцию
callbackк значениюOptionи возвращаетOption, содержащую новое значение.Если
OptionявляетсяNone, возвращаетсяNoneтипа, возвращаемого функциейcallback.См. также:
-
flatMap proc для версии с обратной функцией, возвращающей
Option - filter proc
Пример:
var a = some(42) b = none(int) proc isEven(x: int): bool = x mod 2 == 0 assert $(a.map(isEven)) == "Some(true)" assert $(b.map(isEven)) == "None[bool]"
Исходный код Редактировать -
flatMap proc для версии с обратной функцией, возвращающей
proc flatten[A](self: Option[Option[A]]): Option[A] {...}{.inline.}- Удаляет один уровень структуры вложенной
Option.Пример:
let a = some(some(42)) assert $flatten(a) == "Some(42)"
Исходный код Редактировать proc flatMap[A, B](self: Option[A]; callback: proc (input: A): Option[B]): Option[ B] {...}{.inline.}-
Применяет функцию
callbackк значениюOptionи возвращаетOption, содержащую новое значение.Если
OptionявляетсяNone, возвращаетсяNoneтипа, возвращаемого функциейcallback.Аналогично
map, с разницей в том, чтоcallbackвозвращаетOption, а не простое значение. Это позволяет объединять несколько функций с сигнатуройA -> Option[B].См. также:
Пример:
proc doublePositives(x: int): Option[int] = if x > 0: return some(2*x) else: return none(int) let a = some(42) b = none(int) c = some(-11) assert a.flatMap(doublePositives) == some(84) assert b.flatMap(doublePositives) == none(int) assert c.flatMap(doublePositives) == none(int)Исходный код Редактировать proc filter[T](self: Option[T]; callback: proc (input: T): bool): Option[T] {...}{. inline.}-
Применяет функцию
callbackк значениюOption.Если
callbackвозвращаетtrue, опция возвращается какSome. Если она возвращаетfalse, она возвращается какNone.См. также:
Пример:
proc isEven(x: int): bool = x mod 2 == 0 let a = some(42) b = none(int) c = some(-11) assert a.filter(isEven) == some(42) assert b.filter(isEven) == none(int) assert c.filter(isEven) == none(int)
Исходный код Редактировать proc `==`(a, b: Option): 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 `$`[T](self: Option[T]): string
-
Получить строковое представление
Option.Если
Исходный код РедактироватьOptionсодержит значение, результат будетSome(x), гдеx- строковое представление содержащегося значения. ЕслиOptionне содержит значение, результат будетNone[T], гдеT- имя типа, содержащегося вOption. proc unsafeGet[T](self: Option[T]): lent T {...}{.inline.}-
Возвращает значение
some. Поведение дляnoneне определено.Примечание: Используйте его только когда вы абсолютно уверены, что значение присутствует (например, после проверки isSome). Обычно предпочтительнее использовать get proc.
Исходный код Редактировать
© 2006–2021 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/options.html