首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Ruby变量(数组)赋值误解(使用push方法)

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

Stack Overflow用户
提问于 2010-09-09 06:32:52
回答 2查看 4.8K关注 0票数 2

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

代码语言:javascript
运行
复制
#!/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

它的输出是

代码语言:javascript
运行
复制
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 to local_ar_2如何更改其他两个数组?我对局部变量的理解是,一旦创建了局部变量,它们就不应该影响任何其他变量,即它们是局部变量。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-09-09 06:35:44

Ruby与引用一起工作!请记住这一点。如果你想要一个副本,你必须这样做:

代码语言:javascript
运行
复制
@instance_ar = [1,2,3,4]
local_ar = @instance_ar.clone
local_ar_2 = local_ar.clone

编辑:

示例:

代码语言:javascript
运行
复制
a = ["a", "b", "c"]
b = a[0]
b = "d" # We assign a new object to b!

a是:=> "a","b","c“

但是:

代码语言:javascript
运行
复制
a = ["a", "b", "c"]
b = a[0]
b[0] = "d" # We are working with the reference!

a is:
=> ["d", "b", "c"]

a = "hello"
b = a
b += " world" 
# Is the same as b = b + " world", we assign a new object!

a是:=>“你好”

但是:

代码语言:javascript
运行
复制
a = "hello"
b = a
b<<" world"
# We are working with the reference!

a是:=> "hello world“

代码语言:javascript
运行
复制
a = "abc"
b = a
b[0] = "d" # we are working with the reference

a为:=> "dbc“

你可以在这里阅读到关于它的一切:http://ruby-doc.org/docs/ProgrammingRuby/。向下滚动到页面底部的“变量”。

票数 9
EN

Stack Overflow用户

发布于 2010-09-09 06:56:21

在Ruby中,您不是“创建变量”,而是创建对象(在本例中是一个数组),并将它们赋给变量。因此,在您的示例中,您有一个具有两个名称的数组:local_arlocal_ar_2。然后更改对象,而不是变量(它们仍然指向同一个更改后的对象)。

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

代码语言:javascript
运行
复制
int a[5];
int * b;

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

printf("%d", a[1]);

打印的号码是多少?这与Ruby代码中发生的事情非常相似。

注意:使用for遍历数组在Ruby语言中不是惯用的。人们通常使用:

代码语言:javascript
运行
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3672399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档