a=b=c=d=7
# a, b, c and d points to the same integer object "7"
b = 8
# b now points to a new object "8"
# "=" does not change the value of the pointer integer,
# it assings a new reference like in the line above
puts d
# obviously, d still points to "7"
c = 111
# c now points to another integer object "111"
puts a
# a still points to "7"
d = 999
# d now points to a new integer object "999"
puts b
# b still points to "8"
в Ruby, объект Integer является неизменным, поэтому вы не можете присвоить Integer множественной ссылке и изменить его значение после.
Как подсказывает @pts, вы должны использовать массив, чтобы обернуть вашу целочисленную ссылку, потому что массивы изменчивы, чтобы вы могли изменить значение после.
a=b=c=d=[7]
b[0] = 8
puts d[0]
c[0] = 111
puts a[0]
d[0] = 999
puts b[0]
РАЗЪЯСНЕНИЯ:
Если вы пришли из C ++ фона, это может быть странно, потому что C ++ делает 2 вещи с одинаковым синтаксисом, назначая ссылку и изменяя значение, на которое ссылаются.
int a = 10; // creates an int on the stack with value 10
int& b = a; // creates a reference to an int and references the a variable
b = 5; // change the value referenced by b (so a) to 5
// a and b now hold the value 5
В Ruby ссылки являются изменяемыми, а целые - нет (в точности как в C ++). Таким образом, назначение ссылки фактически изменит ссылку, а не ссылочное значение.
Другим решением было бы создание класса, который является изменяемым целым числом:
class MutableInteger
attr_writer :value
def initialize(value)
@value = value
end
def inspect
value
end
def to_i
value
end
def to_s
value
end
end
a = b = MutableInteger.new(10)
a.value = 5
puts b
# prints 5