# sol2 3.5.0 documentation

## table traversal keys

### Search the Documentation

# table traversal keys

the definitive way to get and set things easily

Objects `sol::update_if_empty`, `sol::create_if_nil`, and `sol::override_value` are special keys one can pass into a table traversal to enable creating tables as they go in `nil`/empty spaces, optionally updating a value at the end of a chain of lookups if it is empty, or overriding the values and tables along a chain as they go. Each special key can be used in lookup and setting functionality on tables. It is primarily to enable easy use and creation of functionality like so:

     1#define SOL_ALL_SAFETIES_ON 1
     2#include <sol/sol.hpp>
     3
     4#include <iostream>
     5
     6void create_namespace_sf(sol::state& lua) {
     7	// this would explode
     8	// lua["sf"]["value"] = 256;
     9	lua[sol::create_if_nil]["sf"]["value"] = 256;
    10}
    11
    12int main(int, char*[]) {
    13
    14	std::cout << "=== sol::lua_value/sol::array_value ==="
    15	          << std::endl;
    16
    17	sol::state lua;
    18	lua.open_libraries(sol::lib::base);
    19
    20	const auto& code = R"(
    21		print(sf)
    22		print(sf.value)
    23		assert(sf.value == 256)
    24	)";
    25
    26	auto result
    27	     = lua.safe_script(code, sol::script_pass_on_error);
    28	// did not work
    29	SOL_ASSERT(!result.valid());
    30
    31	// create values
    32	create_namespace_sf(lua);
    33
    34	auto result2
    35	     = lua.safe_script(code, sol::script_pass_on_error);
    36	// it worked properly
    37	SOL_ASSERT(result2.valid());
    38
    39	std::cout << std::endl;
    40
    41	return 0;
    42}