我发现我对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
Run Code Online (Sandbox Code Playgroud)
输出是
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
Run Code Online (Sandbox Code Playgroud)
质疑:如何push来local_ar_2改变其他两个阵列?我对局部变量的理解是,一旦它们被创建,它们不应该影响任何其他变量,因为它们是本地变量.
问题B:我怎样才能避免这样的事情发生?来自C和Perl,这只是让我大吃一惊.
Ruby使用引用!记在脑子里.如果你想要一份副本,你必须这样做:
@instance_ar = [1,2,3,4]
local_ar = @instance_ar.clone
local_ar_2 = local_ar.clone
Run Code Online (Sandbox Code Playgroud)
编辑:
例子:
a = ["a", "b", "c"]
b = a[0]
b = "d" # We assign a new object to b!
Run Code Online (Sandbox Code Playgroud)
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!
Run Code Online (Sandbox Code Playgroud)
a 是:=>"你好"
但:
a = "hello"
b = a
b<<" world"
# We are working with the reference!
Run Code Online (Sandbox Code Playgroud)
a 是:=>"你好世界"
a = "abc"
b = a
b[0] = "d" # we are working with the reference
Run Code Online (Sandbox Code Playgroud)
a 是:=>"dbc"
你可以在这里阅读有关它的所有内容:http://ruby-doc.org/docs/ProgrammingRuby/.在页面底部几乎向下滚动到"变量".