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, вы должны использовать массив, чтобы обернуть ссылку на Integer, поскольку массивы изменяемы, вы можете изменить значение после.
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
Мы могли бы дать вам более подробный ответ, если вы сообщите нам, что фон вы откуда. – kch
Вы знаете, что Ruby настолько заразительно, что вы действительно можете заставить этот образец работать как ожидалось –
Я просмотрел этот раздел книги, и если я не ошибаюсь, то вы имеете в виду строки и метод, который изменяет строку на месте (строки изменяемы, целые - нет). –