我对这段代码有疑问。
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
感谢您的帮助。
答案 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。