Menu
CoddyTech

Mesclando dicionários

Parte da seção Lógica e fluxo do Journey de GDScript da Coddy. Lição 21 de 78.

merge() adiciona cada par de outro dicionário ao dicionário em que você o chama. As chaves que existem apenas no outro dicionário são adicionadas ao final:

var settings := {"volume": 5, "difficulty": "normal"}
var saved := {"difficulty": "hard", "subtitles": true}
settings.merge(saved)
print(settings)
{ "volume": 5, "difficulty": "normal", "subtitles": true }

"difficulty" está nos dois dicionários, e merge() manteve o valor que settings já tinha: por padrão, as chaves existentes não são sobrescritas. Passe true como segundo argumento para que o outro dicionário prevaleça:

var options := {"volume": 5, "difficulty": "normal"}
options.merge(saved, true)
print(options["difficulty"]) # hard

merge() altera o próprio dicionário e não retorna nada, então var result := a.merge(b) é um erro. Para manter os dois dicionários como estão, use merged(). Ele recebe os mesmos argumentos e retorna um novo dicionário:

var defaults := {"volume": 5, "difficulty": "normal"}
var choice := {"difficulty": "hard"}
var final_settings := defaults.merged(choice, true)
print(final_settings) # { "volume": 5, "difficulty": "hard" }
print(defaults) # { "volume": 5, "difficulty": "normal" }

Quando uma chave está em ambos os dicionários e você quer combinar os valores, por exemplo, somar duas quantidades, escreva o loop por conta própria:

var bag := {"gold": 10, "gems": 1}
var loot := {"gold": 5, "keys": 2}
for key in loot:
	bag[key] = bag.get(key, 0) + loot[key]
print(bag) # { "gold": 15, "gems": 1, "keys": 2 }
challenge icon

Desafio

Fácil

Uma atualização do jogo adicionou novas configurações. As configurações salvas pelo jogador são lidas de uma linha de entrada, escrita como pares key=value separados por vírgulas (a linha pode estar vazia). O código fornecido armazena essas configurações no dicionário saved.

Preencha as configurações que faltam no salvamento: adicione a saved cada par de defaults cuja chave ainda não esteja nele, sem alterar os valores escolhidos pelo jogador e sem alterar defaults. Em seguida, imprima saved e imprima defaults na linha seguinte.

Para a entrada difficulty=hard,volume=8, a saída é:

{ "difficulty": "hard", "volume": "8", "subtitles": "off", "language": "en" }
{ "difficulty": "normal", "volume": "5", "subtitles": "off", "language": "en" }

Experimente você mesmo

extends Node

func _ready():
	var defaults := {"difficulty": "normal", "volume": "5", "subtitles": "off", "language": "en"}
	var saved := {}
	for pair in OS.read_string_from_stdin().split(",", false):
		var parts := pair.split("=")
		saved[parts[0]] = parts[1]

	# Adicione a saved os valores padrão ausentes e, em seguida, imprima ambos os dicionários
	pass
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Lógica e fluxo

Pratique por conta própria: Compilador de GDScript online