调用方法时的 Ruby 变量行为

标签 ruby

我很擅长从谷歌上获得答案,但我就是不明白这一点。在下面的代码中,为什么在调用“addup”后变量“b”发生了变化?我想我明白为什么 'a' 会发生变化(虽然它有点模糊),但我想将原始数组 'a' 保存到 'b' 中,在 'a' 上运行该方法所以我有两个具有不同内容的数组。我做错了什么?

提前致谢

def addup(arr)

  i=0
  while i< arr.length
    if arr[i]>3
      arr.delete_at(i)
    end
    i += 1
  end

  return arr

end

a = [1,2,3,4]
b = a

puts "a=#{a}"             # => [1,2,3,4]
puts "b=#{b}"             # => [1,2,3,4]
puts "addup=#{addup(a)}"  # => [1,2,3]
puts "a=#{a}"             # => [1,2,3]
puts "b=#{b}"             # => [1,2,3]

最佳答案

ab 都持有对内存中同一个数组对象的引用。为了将原始数组保存在 b 中,您需要复制该数组。

a = [1,2,3,4] # => [1, 2, 3, 4]
b = a         # => [1, 2, 3, 4]
c = a.dup     # => [1, 2, 3, 4]
a.push 5      # => [1, 2, 3, 4, 5]
a             # => [1, 2, 3, 4, 5]
b             # => [1, 2, 3, 4, 5]
c             # => [1, 2, 3, 4]

有关为什么会发生这种情况的更多信息,请阅读 Is Ruby pass by reference or by value?

关于调用方法时的 Ruby 变量行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51324772/

相关文章:

ruby-on-rails - Rails 命名空间助手

Ruby - 每个起始偏移量

ruby-on-rails - 通过 capistrano 部署安装 pg 时出错

ruby - 检查文件名是文件夹还是文件

ruby-on-rails - Ruby on Rails 日期重叠

mysql - 在 rbenv 上安装 mysql gem

ruby - some_method 的循环复杂度太高

ruby - 如何使用 Mechanize/Nokogiri 获取页面源

ruby - 使用 Rspec 2 和 Mocha 获取 Rails 3 生成器

访问数组中第一个/最后一个元素的 Ruby 约定