Spec-Zone.ru › Nim 1

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.

См. также:

  • some
  • 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.

См. также:

  • option
  • none
  • isSome

Пример:

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 для данного типа без значения.

См. также:

  • option
  • some
  • isNone

Пример:

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]"
Исходный код Редактировать
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].

См. также:

  • flatten proc
  • filter proc

Пример:

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.

См. также:

  • map proc
  • flatMap proc

Пример:

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API