gpt4 book ai didi

ruby - Ruby 中的多个引用

转载 作者:太空宇宙 更新时间:2023-11-03 17:00:40 25 4
gpt4 key购买 nike

我希望下面的代码能够打印“8”、“111”和“999”。我假设每个 a、b、c 和 d 都指向相同的内存位置。如果我通过其中一个更改位置,为什么另一个不更改?显然,我的逻辑很差,或者我忽略了一些东西。它会打印“7”、“7”和“8”。

为什么?

a=b=c=d=7
b = 8
puts d

c = 111
puts a

d = 999
puts b

[澄清]

我困惑的原因是the book (page 20).中的例子他们在那里更改了类似的值,但他们得到了我上面建议的结果。我们说的是同一个问题吗?

最佳答案

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++ 使用相同的语法做了两件事,即分配引用和更改引用的值。

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

关于ruby - Ruby 中的多个引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/816719/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com