Вот простой пример, когда возвращаемое значение будет 26
, а не 12
:
# let p = {x=0; y=0};;
val p : dot = {x = 0; y = 0}
# f p p;;
- : int = 26
Здесь p
- это объект, который имеет два изменяемых поля x
и y
. При применении функция f
получает тот же объект, что и dot1
и dot2
, поэтому оба имени dot1
и dot2
относятся к одному и тому же объекту и, независимо от того, какое имя вы используете, приведутна модификацию объекта p
.
Другой пример, который не включает в себя какие-либо функции, а только let
связанные имена,
# let p1 = p;;
val p1 : dot = {x = 26; y = 0}
# let p2 = p;;
val p2 : dot = {x = 26; y = 0}
# p1.y <- 1;;
- : unit = ()
# p;;
- : dot = {x = 26; y = 1}
# p2.x <- 11;;
- : unit = ()
# p;;
- : dot = {x = 11; y = 1
Как вы можете видеть, привязка имени - это просто привязка имени, поэтому она несоздание нового объекта или чего-то подобного.