这两种内存分配有什么区别?
What is the difference between these two memory assignments?
我今天试图解决一个卡塔,它让我在练习的一部分中循环。我遇到的问题可以简化为以下细微差别:
node = [1]
root_node = node
node << 2
p node #[1,2]
p root_node #[1,2]
node = 1
root_node = node
new_node = 3
node = new_node
p node #3
p root_node #1
为什么当我修改分配给一个变量的数组时 node
和 root_node
都发生了变化,但为一个变量赋值却没有修改另一个?
我本以为 node = [1,2]
和 root_node = [1]
。
有人可以阐明这一点或指导我寻找有关此的文档。我想我从来没有注意到是这样的。谢谢你。
当你给一个数组赋值时,变量保存了一个对该数组的引用值。当您将其分配给另一个变量时,将复制该引用。然后当你调用 <<
改变数组时,它在两个变量下都是可见的,因为只有一个数组。
当你分配一个整数时,这个整数的值被存储在变量中。当您重新分配它时,另一个值将存储在此变量中。如果您使用常量 a = 1
或另一个变量 a = b
.
重新分配它,则没有区别
需要注意的重要一点是,数组的赋值也是如此——引用的值被重新赋值。如果你给另一个数组赋值,原来的数组不会改变。
node = [1]
root_node = node
new_node = [3]
node = new_node
p node
#[3]
p root_node
#[1]
另请参阅:
- https://learn.co/lessons/pass-by-reference
- Is Ruby pass by reference or by value?
- https://robertheaton.com/2014/07/22/is-ruby-pass-by-reference-or-pass-by-value/
我今天试图解决一个卡塔,它让我在练习的一部分中循环。我遇到的问题可以简化为以下细微差别:
node = [1]
root_node = node
node << 2
p node #[1,2]
p root_node #[1,2]
node = 1
root_node = node
new_node = 3
node = new_node
p node #3
p root_node #1
为什么当我修改分配给一个变量的数组时 node
和 root_node
都发生了变化,但为一个变量赋值却没有修改另一个?
我本以为 node = [1,2]
和 root_node = [1]
。
有人可以阐明这一点或指导我寻找有关此的文档。我想我从来没有注意到是这样的。谢谢你。
当你给一个数组赋值时,变量保存了一个对该数组的引用值。当您将其分配给另一个变量时,将复制该引用。然后当你调用 <<
改变数组时,它在两个变量下都是可见的,因为只有一个数组。
当你分配一个整数时,这个整数的值被存储在变量中。当您重新分配它时,另一个值将存储在此变量中。如果您使用常量 a = 1
或另一个变量 a = b
.
需要注意的重要一点是,数组的赋值也是如此——引用的值被重新赋值。如果你给另一个数组赋值,原来的数组不会改变。
node = [1]
root_node = node
new_node = [3]
node = new_node
p node
#[3]
p root_node
#[1]
另请参阅:
- https://learn.co/lessons/pass-by-reference
- Is Ruby pass by reference or by value?
- https://robertheaton.com/2014/07/22/is-ruby-pass-by-reference-or-pass-by-value/