ch05.md 2.7 KB

Глава 5. Передача параметров и изменяемость

Каждый параметр в Nim является неизменяемым, если только он не объявлен как параметр var.

Это означает, что следующий код не компилируется:

proc resetPointsToOrigin(points: seq[Point]) =
    for i in 0 ..< points.len:      # 1
      points[i] = Point(x: 0, y: 0) # 2
  • 1 Код перебирает все индексы точек с помощью итератора, использующего операторный символ ..<. Символ ..< указывает на то, что верхняя граница является исключительной, а это именно то, что нам нужно, поскольку индексация начинается с 0.
  • 2 Затем код пытается изменить points[i] и присвоить ему новое значение — Point(x: 0, y: 0). Но компилятор отклоняет это выражение!

Компилятор отклоняет этот код, поскольку points — это параметр, который можно использовать только для чтения. Это ограничение помогает нам писать более понятный код, который лучше масштабируется для больших программ, и в то же время помогает компилятору генерировать более качественный машинный код.

Чтобы иметь возможность изменять точки, нам нужен параметр var:

proc resetPointsToOrigin(points: var seq[Point]) = # 1
    for i in 0 ..< points.len:
      points[i] = Point(x: 0, y: 0)                # 2
  • 1 Параметр points — это изменяемая последовательность переменных
  • 2 значит, изменение допустимо.

Если теперь попробовать вызвать resetPointsToOrigin с помощью конструктора seq, компилятор снова отклонит наш код:

resetPointsToOrigin @[Point(x: 2, y: 4)]

Причина в том, что последовательность, созданная с помощью @[], неизменяема. Переменная с параметром var может быть изменена, поэтому следующий код допустим:

var points = @[Point(x: 2, y: 4)]
resetPointsToOrigin points