具有相同对象id的Ruby变量

时间:2013-10-09 20:36:25

标签: ruby search

我对这段代码有疑问。

temp_state = @state

我想要做的是将实例变量@state的值分配给新的局部变量temp_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

感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

您必须复制对象,而不是传递给同一对象的新变量引用。您使用Object#dup方法制作(浅)副本:

temp_state = @state.dup

答案 1 :(得分:1)

当您将ruby中的变量分配给另一个变量时,它首先指向您,这是您在此处找到的。在Ruby中,有很多方法可以解决这个问题。一个是.dup方法,它使第一个变量的浅拷贝而不仅仅是一个引用。在这里查看他的文档:http://ruby-doc.org/core-2.0.0/Object.html#method-i-dup

答案 2 :(得分:1)

你想要temp_state = @state.dup,但这不适用于所有对象,即。 Fixnums。