具有相同对象id的Ruby变量

具有相同对象id的Ruby变量,ruby,search,Ruby,Search,我对那段代码有问题 temp_state = @state 我要做的是将实例变量@state的值赋给一个新的局部变量temp\u state。问题是当我这么做的时候 temp_state.object_id = 70063255838500 state.object_id = 70063255838500 当我修改temp_state时,我也在修改@state。如何在不修改@state内容的情况下使用temp_state 以下是本课程的重要部分: class SearchNode att

我对那段代码有问题

temp_state = @state
我要做的是将实例变量@state的值赋给一个新的局部变量temp\u state。问题是当我这么做的时候

temp_state.object_id = 70063255838500
state.object_id = 70063255838500
当我修改temp_state时,我也在修改@state。如何在不修改@state内容的情况下使用temp_state

以下是本课程的重要部分:

class SearchNode
  attr_accessor :state, :g, :f, :free_index

  def initialize(state, parent = self)
    @state = state
    @g = parent == self ? 1 : parent.g
    @h = calculate_h
    @f = @g + @h
    @valid_action = ["Move(Black)", "Move(Red)", "Jump(Black)", "Jump(Red)"]
    @free_index = index_of_free
    @parent = parent
  end

  def move_black_jump
    free = @free_index
    # PROBLEM NEXT LINE
    temp_state = @state
    if temp_state[free + 2] == 'B' || temp_state[free - 2] == 'B'
      if free - 2 >= 0 && free + 2 <= temp_state.length
        index = free - 2 if temp_state[free - 2] == 'B'
        index = free + 2 if temp_state[free + 2] == 'B'
      else
        puts "ERROR: Movement out of bounds."
      end
        x = temp_state[index]
        temp_state[index] = 'F'
        temp_state[free] = x
     else
       puts "ERROR: Wrong movement move_black_jump."
     end
     return temp_state
   end

end
类搜索节点
属性访问器:state,:g,:f,:free\u索引
def初始化(状态,父项=自身)
@状态=状态
@g=父母==自己?1:parent.g
@h=计算
@f=@g+@h
@有效的_操作=[“移动(黑色)”,“移动(红色)”,“跳转(黑色)”,“跳转(红色)”]
@自由指数=自由指数的指数
@父=父
结束
def移动\黑色\跳跃
free=@free\u索引
#下一行的问题
温度状态=@state
如果临时状态[自由+2]=“B”|临时状态[自由-2]=“B”

如果free-2>=0&&free+2您必须复制对象,而不是传递给同一对象的新变量引用。使用以下方法进行(浅)复制:


您必须复制对象,而不是传递给同一对象的新变量引用。使用以下方法进行(浅)复制:


当您将ruby中的变量分配给另一个变量时,它指向的是第一个变量,您已经在这里找到了。在Ruby中,有很多方法可以解决这个问题。一种是.dup方法,它生成第一个变量的浅拷贝,而不仅仅是一个引用。查看这里的文档:

当您将ruby中的变量分配给它首先指向的另一个变量时,您已经在这里找到了它。在Ruby中,有很多方法可以解决这个问题。一种是.dup方法,它生成第一个变量的浅拷贝,而不仅仅是一个引用。查看这里的文档:

你想
temp\u state=@state.dup
但这并不适用于所有对象,例如Fixnums。

你想
temp\u state=@state.dup
但这不适用于所有对象,例如Fixnums。

Ruby中存在显式指针吗?我一直认为它们只是对其值的引用Ruby中是否存在PLICIT指针?我一直认为它们只是参考了它们的价值。至少有两个答案指出,
dup
制作了接收器的“浅”拷贝。如果您或其他读者不理解限定词“shallow”的意义,以下两个示例可能会有所帮助:
a=[1,2,3];b=a.dup#=>[1,2,3];a[1]=“cat”#a=>[1,“cat”,3],b=>[1,2,3]
但如果
a=[1,[2,3];b=a.dup#=>[1[2,3];[0]=“狗”;a[1]=“cat”#a=>[“dog”、[2,“cat”]、b=>[1[2,“cat”]]
。至少有两个答案指出,
dup
是它的接收者的“浅”复制品。如果你或其他读者不理解限定词“浅”的意义,这两个例子可能会有所帮助:
a=[1,2,3];b=a.dup=>[1,2,3];a[1]=“cat”=>a=[1,3],cat=[1,3]
但是如果
a=[1,2,3];b=a.dup=>[1,2,3];a[0]='dog';a[1]='cat'\a=>[“dog”、[2,“cat”],b=>[1,2,“cat”]]
temp_state = @state.dup