Erlang Выписка из карты - PullRequest
       38

Erlang Выписка из карты

0 голосов
/ 16 мая 2019

Ниже приведен объект в записи типа

requirements    = [] :: [term()],

Извлекаем объект Требования как ниже

        Requirements = Records#record.requirements

И мне нужен lat, long, радиус независимо от любого кортежа.latlong_radius. Как мы можем извлечь это?

   "requirements": {
      "supply_type": {
        "$tuple": [1, {
          "$tuple": ["mobile_app", "nil", "nil"]
        }]
      },
      "has_app_name": true,
      "any": {
        "latlong_radius": {
          "$tuple": [33.042334, -96.734884, 16093.4]
        }
      },
    },

Ответы [ 2 ]

2 голосов
/ 17 мая 2019
-module(my).
-compile(export_all).

-record(requirements, {supply_type,
                       has_app_name,
                       any} ).

get_requirements() -> 
    #requirements{
        supply_type = #{"$tuple" => [1, 2, 3]},
        has_app_name = true,
        any = #{"latlong_radius" => 
                    #{"$tuple" => [33.042334, -96.734884, 16093.4]}
               }
    }.


go() ->
    Requirements = get_requirements(),
    io:format("requirements: ~p~n", [Requirements]),

    Any =  Requirements#requirements.any,

    #{"latlong_radius" := 
          #{"$tuple" := [Lat, Lon, Rad]}
    } = Any,

    io:format("Lat: ~w, Lon: ~w, Rad: ~w~n", [Lat, Lon, Rad]).

В оболочке:

51> c(my).  
my.erl:2: Warning: export_all flag enabled - all functions will be exported
{ok,my}

52> my:go().
requirements: {requirements,#{"$tuple" => [1,2,3]},
                            true,
                            #{"latlong_radius" =>
                                  #{"$tuple" =>
                                        [33.042334,-96.734884,16093.4]}}}

Lat: 33.042334, Lon: -96.734884, Rad: 16093.4
ok

С другой стороны, если ваша структура данных полностью отображена (что делает все, что вы опубликовали, о записях и спецификациях списков не имеет значения):

-module(my).
-compile(export_all).

get_requirements() -> 
    #{"requirements" =>
        #{
            "supply_type" => #{"$tuple" => [1, 2, 3]},
            "has_app_name" => true,
            "any" => #{"latlong_radius" => 
                        #{"$tuple" => [33.042334, -96.734884, 16093.4]}
                      }
         }
     }.

go() ->
    Requirements = get_requirements(),
    io:format("requirements: ~p~n", [Requirements]),

    #{"requirements" := 
        #{
            "any" :=
                #{
                    "latlong_radius" := 
                        #{
                            "$tuple" := [Lat, Lon, Rad]
                         }
                 }
         }
     } = Requirements,


    io:format("Lat: ~w, Lon: ~w, Rad: ~w~n", [Lat, Lon, Rad]).

В оболочке:

70> c(my).
my.erl:2: Warning: export_all flag enabled - all functions will be exported
{ok,my}

71> my:go().
requirements: #{"requirements" =>
                    #{"any" =>
                          #{"latlong_radius" =>
                                #{"$tuple" => [33.042334,-96.734884,16093.4]}},
                      "has_app_name" => true,
                      "supply_type" => #{"$tuple" => [1,2,3]}}}

Lat: 33.042334, Lon: -96.734884, Rad: 16093.4
ok

Однако, с глубоко вложенными картами, попытка получить правильный синтаксис соответствия шаблону слишком чревата ошибками, поэтому я бы использовал maps:get/2 вместо этого:

-module(my).
-compile(export_all).

get_requirements() -> 
    #{"requirements" =>
        #{
            "supply_type" => #{"$tuple" => [1, 2, 3]},
            "has_app_name" => true,
            "any" => #{"latlong_radius" => 
                        #{"$tuple" => [33.042334, -96.734884, 16093.4]}
                      }
         }
     }.

go() ->
    Map = get_requirements(),
    io:format("Map: ~p~n", [Map]),

    Requirements = maps:get("requirements", Map),
    Any = maps:get("any", Requirements),
    LLR = maps:get("latlong_radius", Any),
    #{"$tuple" := [Lat, Long, Radius]} = LLR,

    io:format("Lat: ~w, Lon: ~w, Rad: ~w~n", [Lat, Long, Radius]).

Намного, намного проще.

0 голосов
/ 16 мая 2019

Просто присвойте переменную с двойной кавычкой '', как показано ниже:

Latlong_radius = Any#any.latlong_radius
Res = Latlong_radius#latlong_radius.'$tuple'
...