Ruby变量(Array)赋值错误(带push方法)

标签 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 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:pushlocal_ar_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", "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 是: =>“你好”

但是:

a = "hello"
b = a
b<<" world"
# We are working with the reference!

a 是: => “ Hello World ”

a = "abc"
b = a
b[0] = "d" # we are working with the reference

a 是: => “数据库”

您可以在这里阅读所有相关信息:http://ruby-doc.org/docs/ProgrammingRuby/ .向下滚动到几乎位于页面底部的“变量”。

关于Ruby变量(Array)赋值错误(带push方法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3672399/

相关文章:

ruby - 使用散列作为参数时,没有花括号有区别吗?

ruby - 使用 Nokogiri 如何将 Node 对象内容插入到 XML::Builder 结构中?

ruby - Facebook FQL 返回 <fql_query_response list ="true"/>

ruby - 如何在没有 RVM 的情况下在 Ubuntu 上安装 Ruby 2

ruby - 安装 Ruby rvm 时出现问题(运行配置时出错)

ruby - 使用 Ruby + ERB 打印 HTML 列表的优雅方式

ruby-on-rails - 模型和测试中的验证方法之间的错误 :Unit assertion results

ruby - 这个 ruby​​ 属性是否名为 "Open Class"?是否有其他语言具有此属性?

ruby-on-rails - 比较 Rails 中不同区域的日期时间/时间的问题

ruby - 对 BigDecimal 的一般强制转换