数组分配与追加行为

时间:2017-04-28 11:27:27

标签: ruby

以下行为在我看来,assign方法按值处理visited,而append方法将其视为参考:

class MyClass
  def assign(visited)
    visited += ["A"]
  end
  def append(visited)
    visited << "A"
  end
end

instance = MyClass.new
visited = []

instance.assign(visited)
visited # => []

instance.append(visited)
visited # => ["A"]

有人可以解释这种行为吗?

这不是关于Ruby是支持通过引用传递还是通过值传递的问题,而是关于下面提供的示例,以及为什么两个声称做同样事情的方法表现出不同的行为。

2 个答案:

答案 0 :(得分:3)

您在第一种方法中重新定义了局部变量。

这与

相同
visited = []
local_visited = visited
local_visited = ['A']
visited
# => [] 

在第二种方法中:

visited = []
local_visited = visited
local_visited << 'A'
visited
# => ["A"] 

答案 1 :(得分:1)

这是MyClass#assign的修改版本,它会改变visited

class MyClass
  def assign(visited = [])
    visited[0] = "A"
  end
  def append(visited = [])
    visited << "A"
  end
end

instance = MyClass.new
visited = []

instance.assign(visited)
p visited # => ["A"]

visited = []
instance.append(visited)
p visited # => ["A"]