Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby变量(数组)赋值错误(使用push方法)_Ruby - Fatal编程技术网

Ruby变量(数组)赋值错误(使用push方法)

Ruby变量(数组)赋值错误(使用push方法),ruby,Ruby,我在对Ruby或编程理论的理解上发现了一个缺陷,或者两者兼而有之。请看以下代码: #!/usr/bin/ruby -w @instance_ar = [1,2,3,4] local_ar = @instance_ar local_ar_2 = local_ar ### irrelevant_local_ar = [5,6,7,8] ### for i in irrelevant_local_ar local_ar_2.push(i) end count = 0 for i in loca

我在对Ruby或编程理论的理解上发现了一个缺陷,或者两者兼而有之。请看以下代码:

#!/usr/bin/ruby -w
@instance_ar = [1,2,3,4]
local_ar = @instance_ar
local_ar_2 = local_ar
###
irrelevant_local_ar = [5,6,7,8]
###
for i in irrelevant_local_ar
    local_ar_2.push(i)
end
count = 0
for i in local_ar_2
    puts "local_ar_2 value: #{i} and local_ar value: #{local_ar[count]} and @instance_ar value: #{@instance_ar[count]}\n"
    count += 1
end
其结果是

local_ar_2 value: 1 and local_ar value: 1 and @instance_ar value: 1
local_ar_2 value: 2 and local_ar value: 2 and @instance_ar value: 2
local_ar_2 value: 3 and local_ar value: 3 and @instance_ar value: 3
local_ar_2 value: 4 and local_ar value: 4 and @instance_ar value: 4
local_ar_2 value: 5 and local_ar value: 5 and @instance_ar value: 5
local_ar_2 value: 6 and local_ar value: 6 and @instance_ar value: 6
local_ar_2 value: 7 and local_ar value: 7 and @instance_ar value: 7
local_ar_2 value: 8 and local_ar value: 8 and @instance_ar value: 8
问题A:
push
local\u ar\u 2
如何更改其他两个数组?我对局部变量的理解是,一旦它们被创建,它们就不应该影响任何其他变量,因为它们是局部变量

问题B:我怎样才能避免这样的事情发生?
来自C和Perl,这简直让我大吃一惊。

Ruby使用引用!记住这一点。如果你想要一份副本,你必须像这样做:

@instance_ar = [1,2,3,4]
local_ar = @instance_ar.clone
local_ar_2 = local_ar.clone
编辑:

示例:

a = ["a", "b", "c"]
b = a[0]
b = "d" # We assign a new object to b!
a
是: =>[“a”、“b”、“c”]

但是:

a
是: =>“你好”

但是:

a
是: =>“dbc”

您可以在此处阅读有关它的所有内容:。向下滚动到几乎位于页面底部的“变量”。

在Ruby中,您不“创建变量”,而是创建对象(在您的情况下是数组),并将它们分配给变量。因此,在您的示例中,有一个具有两个名称的数组,
local\u ar
local\u ar\u 2
。之后,更改对象,而不是变量(它们仍然指向相同的更改对象)

你说你来自C,看看这个例子:

int a[5];
int * b;

a[0] = 10;
a[1] = 20;
b = a;
b[1] = 5;

printf("%d", a[1]);
将打印什么号码?这与Ruby代码中发生的情况几乎相同

注意:使用
for
迭代数组在Ruby中并不惯用。人们通常使用:

local_ar_2.each_with_index do |i, count|
    puts "local_ar_2 value: #{i} and local_ar value: #{local_ar[count]} and @instance_ar value: #{@instance_ar[count]}\n"
end

我喜欢你第一句话的表达方式,非常简洁,内容丰富。
a = "abc"
b = a
b[0] = "d" # we are working with the reference
int a[5];
int * b;

a[0] = 10;
a[1] = 20;
b = a;
b[1] = 5;

printf("%d", a[1]);
local_ar_2.each_with_index do |i, count|
    puts "local_ar_2 value: #{i} and local_ar value: #{local_ar[count]} and @instance_ar value: #{@instance_ar[count]}\n"
end