相关疑难解决方法(0)

dup和clone都返回不同的对象,但修改它们会改变原始对象

我有一个值数组,当我打印哈希值时,我将其用作订单的参考.我想修改数组,以便数组值"更漂亮".我想我只是复制或克隆数组,更改值,原始对象将保持未被控制.但是(在irb中)......

@arr = ['stuff', 'things']
a = @arr.clone
b = @arr.dup
Run Code Online (Sandbox Code Playgroud)

所以,至少,a和@arr是不同的对象:

a.object_id == @arr.object_id
=> false
Run Code Online (Sandbox Code Playgroud)

但现在它变得奇怪了

a[0].capitalize!
a
=> ['Stuff', 'things']
@arr
=> ['Stuff', 'things'] ##<-what?
b
=> ['Stuff', 'things']## <-what???
Run Code Online (Sandbox Code Playgroud)

好的...所以修改一个会改变其他的,让我们改回来?

a[0] = 'stuff'
a
=> ['stuff', 'things']
@arr
=> ['Stuff', 'things'] ## <- WHAT?????
Run Code Online (Sandbox Code Playgroud)

为了完整性b [1].资本化!具有相同的效果,将所有三个阵列的第二个位置都大写

那么......大写结束时的爆炸会使它变得更加强大吗?足够交叉到其他对象?我知道其他方法,但这对我来说似乎非常奇怪.我认为这与"浅版"有关.建议最好的方法吗?

ruby clone object duplicates

7
推荐指数
1
解决办法
1077
查看次数

Ruby:对象深度复制

我正在研究一些在Ruby中深度复制对象的技术(MRI 1.9.3).
我遇到了以下示例,但我不确定#dup方法实现.我测试了它并且确实有效,但是我不理解该方法的逻辑步骤,因此我在自己的代码中使用它并不舒服.

是语句@name = @name.dup引用伊娃的副本?怎么样?我看不出来.

请问有人解释一下吗?
还有,有更好的方法吗?

class MyClass
  attr_accessor :name

  def initialize(arg_str)   # called on MyClass.new("string")
    @name = arg_str         # initialize an instance variable
  end

  def dup
    the_copy = super        # shallow copy calling Object.dup
    @name = @name.dup       # new copy of istance variable
    return the_copy         # return the copied object
  end
end
Run Code Online (Sandbox Code Playgroud)

ruby deep-copy

4
推荐指数
1
解决办法
2534
查看次数

Ruby:如何使用dup/clone来改变原始实例变量?

学习Ruby,我正在创建一个Battleship项目,我有以下代码作为我正在创建的类"Board"的实例方法.

def hidden_ships_grid
    hidden_s_grid = @grid.dup 
    hidden_s_grid.each_with_index do |sub_array, i|
        sub_array.each_with_index do |el, j|
            # position = [i, j]
            hidden_s_grid[i][j] = :N if el == :S 
       end
    end
end
Run Code Online (Sandbox Code Playgroud)

基本上这个方法会创建一个@grid变量的另一个实例,它将用:N代替每个:S符号.

RSPEC有两个要求:1)"应该返回一个表示网格的2D数组,其中每个:S被替换为:N"和2)"不应该改变原始的@grid".

我的问题是我的上述代码满足第一个要求,但它打破了第二个要求.有人可以向我解释是什么原因导致原始的@grid文件发生变异?我已经完成了15次代码,我无法看到我重写或重新分配原始@grid变量的位置.

提供给我们的"正确"解决方案使用".map",这很好,但我想了解为什么这个解决方案不起作用并最终改变原始的@grid变量.

  1) Board PART 2 #hidden_ships_grid should not mutate the original @grid
     Failure/Error: expect(board.instance_variable_get(:@grid)).to eq([[:S, :N],[:X, :S]])

       expected: [[:S, :N], [:X, :S]]
            got: [[:N, :N], [:X, :N]]

       (compared using ==)

       Diff:
       @@ -1,2 +1,2 @@
       -[[:S, :N], [:X, :S]]
       +[[:N, :N], [:X, :N]]
Run Code Online (Sandbox Code Playgroud)

提前致谢!

ruby

4
推荐指数
1
解决办法
111
查看次数

Ruby - 按值传递

有没有办法按值传递对象而不是Ruby中的引用?例如,

class Person
  attr_accessor :name
end
def get_name(obj)
  obj.name = "Bob"
  puts obj.name
end
jack = Person.new
jack.name = "Jack"
puts jack.name
get_name(jack)
puts jack.name
Run Code Online (Sandbox Code Playgroud)

输出应该是

Jack
Bob
Jack
Run Code Online (Sandbox Code Playgroud)

代替

Jack
Bob
Bob
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激.

ruby object

2
推荐指数
1
解决办法
1005
查看次数

枚举期间正在修改数组

我的情况非常复杂,这就是为什么我用简单数字替换原始数据的原因。因此,请不要注意非常简单的数据和条件是否“愚蠢”的情况。这只是一个例子。另外,如果有错,请忽略错别字-原始代码没有错字。

我有一些像这样的哈希值数组 my_hsh = {"numbers" => [1, 2, 3, 4], "n_count" => 4}

我需要做什么:

  1. 遍历父数组并选择适当的哈希,
  2. 将每个这样的哈希添加到数组中my_arr_nochange
  3. 在每个此类哈希中遍历“数字”,然后将它们添加到the_hash["numbers"]
  4. 将没有这些数字的哈希添加到my_arr_updt

所以代码:

the_hash = {"numbers" => []}
my_arr_updt = []
my_arr_nochange = []
array_of_hashes.each do |my_hsh|
  if my_hsh["n_count"] == 4
    my_arr_nochange << my_hsh
    updated_hsh = my_hsh
    my_hsh["numbers"].each do |num|
      if num == 2
        the_hash["numbers"] += [ num ]
        updated_hsh["numbers"] -= [ num ]
      end
    end
    my_arr_updt << updated_hsh
  end
end

return the_hash, my_arr_updt, my_arr_nochange
Run Code Online (Sandbox Code Playgroud)

问题正在my_arr_nochange被修改,所以我没有获取旧状态的my_hsh而是获取了新状态。喜欢: …

ruby variables

1
推荐指数
1
解决办法
48
查看次数

标签 统计

ruby ×5

object ×2

clone ×1

deep-copy ×1

duplicates ×1

variables ×1