ruby 中的意外 return 值
Unexpected return value in ruby
def gen_path_locations(start, destination)
initial_dest = destination
last_dest = destination
path_locations = []
loop do
last_dest[0] -= 1 if initial_dest[0] > start[0]
last_dest[0] += 1 if initial_dest[0] < start[0]
last_dest[1] -= 1 if initial_dest[1] > start[0]
last_dest[1] += 1 if initial_dest[1] < start[0]
break if last_dest == start
path_locations << last_dest
puts last_dest.inspect
end
path_locations
end
gen_path_locations([5, 5], [9, 9])
returns [[5, 5], [5, 5], [5, 5]]
它将起始位置添加到我的 path_locations 而不是 last_dest 的当前迭代。当然,如果我把推送改成这样:
path_locations << [last_dest[0], last_dest[1]]
它returns 预期值。我错过了什么?
What am I missing?
一个.clone
:
path_locations << last_dest.clone
否则,您将不断添加内容不断变化的同一个对象;最后,你仍然会拥有同一个对象 3 次,其内容是你最后更改的内容。
举个例子来说明:
a = ["foo", "bar"]
b = [a, a, a]
# => [["foo", "bar"], ["foo", "bar"], ["foo", "bar"]]
a[1] = "quux"
b
# => [["foo", "quux"], ["foo", "quux"], ["foo", "quux"]]
你可以看到发生了什么here。该工具不适用于 Ruby,但很高兴该示例也适用于 Python。
编辑:实际上,here是link对你的代码的可视化,重写为Python - 你可以逐步查看到底发生了什么。然后用 path_locations.append([last_dest[0], last_dest[1]])
替换追加行,这正是您所做的(并且正是 Ruby 的 clone
所做的更简洁),看看它如何改变程序。
def gen_path_locations(start, destination)
initial_dest = destination
last_dest = destination
path_locations = []
loop do
last_dest[0] -= 1 if initial_dest[0] > start[0]
last_dest[0] += 1 if initial_dest[0] < start[0]
last_dest[1] -= 1 if initial_dest[1] > start[0]
last_dest[1] += 1 if initial_dest[1] < start[0]
break if last_dest == start
path_locations << last_dest
puts last_dest.inspect
end
path_locations
end
gen_path_locations([5, 5], [9, 9])
returns [[5, 5], [5, 5], [5, 5]]
它将起始位置添加到我的 path_locations 而不是 last_dest 的当前迭代。当然,如果我把推送改成这样:
path_locations << [last_dest[0], last_dest[1]]
它returns 预期值。我错过了什么?
What am I missing?
一个.clone
:
path_locations << last_dest.clone
否则,您将不断添加内容不断变化的同一个对象;最后,你仍然会拥有同一个对象 3 次,其内容是你最后更改的内容。
举个例子来说明:
a = ["foo", "bar"]
b = [a, a, a]
# => [["foo", "bar"], ["foo", "bar"], ["foo", "bar"]]
a[1] = "quux"
b
# => [["foo", "quux"], ["foo", "quux"], ["foo", "quux"]]
你可以看到发生了什么here。该工具不适用于 Ruby,但很高兴该示例也适用于 Python。
编辑:实际上,here是link对你的代码的可视化,重写为Python - 你可以逐步查看到底发生了什么。然后用 path_locations.append([last_dest[0], last_dest[1]])
替换追加行,这正是您所做的(并且正是 Ruby 的 clone
所做的更简洁),看看它如何改变程序。