Рецепт: Передача переменных простых типов по ссылке

Предположим, вы хотите написать функцию, модифицирующую значение переменной простого типа «на лету».

Если вы сделаете вот так:

def inc(cnt : Int32)
  cnt += 1
end
n = 0
inc(n)
puts n
# "0" will be printed

— ничего у вас не выйдет, поскольку в действительности значение cnt передано не по ссылке, а по значению. Если вдаваться в технические подробности, то значение переменной cnt будет скопировано на вершину стека вызова функции-«метода», а внутри этой функции будет модифицировано именно значение в стеке, а не исходная переменная cnt.

Как же правильно передать значение по ссылке?
Многословность спасёт мир:

def inc(cnt : Pointer(Int32))
  cnt.value += 1
end
n = 0
inc(pointerof(n))
puts n
# output: "1"

(Посмотреть, как работает код...)

Собственно, не сильно отличается от вызова аналогичной функции в Си, только «буков» местами больше, но зато и читается легче.

Всего наилучшего и до новых встреч!

0 комментариев