首页 > 解决方案 > 通过匹配 erlang 中的键来创建和访问记录的值

问题描述

我正在尝试使用 map 声明和初始化记录(Example: -record(month_names,#{1=> "January",2=>"February",3=>"March",4=>"April",5=>"May",6=>"June",7=>"July",8=>"August",9=>"September",10=>"October",11=>"November",12=>"December"}).),但是当我尝试访问 map 的值时,它没有得到输出。

试过的代码:

**

-module(main).
-export([calender/1]).
-record(month_days, #{1=> "31",2 => "28",3=>"31",4=>"30",5=>"31",6=>"30",7=>"31",8=>"31",9=>"30",10=>"31",11=>"30",12=>"31"}).
-record(month_names,#{1=> "January",2 => "February",3=>"March",4=>"April",5=>"May",6=>"June",7=>"July",8=>"August",9=>"September",10=>"October",11=>"November",12=>"December"}).
calender(Year) ->
 Day = #month_days{month_days= 1,val= 1},
 io:fwrite("~p~n",Year),
 io:fwrite("~p~n", [Day#month_days.month_days]).

**

但我在下面给出的错误:

错误 :

**

10> c(main).
main.erl:3: bad record declaration
main.erl:4: bad record declaration
main.erl:8: record month_days undefined
main.erl:10: record month_days undefined
error

**

标签: erlang

解决方案


我正在尝试使用地图声明和初始化记录

这在 Erlang 中是不可能的。Erlang 记录以原子作为键,可以选择提供默认值,并且不能用映射初始化。有关记录,请参阅编程示例

在这种情况下,您不需要使用记录;您可以按原样使用地图:

calender(Year) ->
 MonthDays = #{1=> "31",2 => "28",3=>"31",4=>"30",5=>"31",6=>"30",7=>"31",8=>"31",9=>"30",10=>"31",11=>"30",12=>"31"},
 MonthNames = #{1=> "January",2 => "February",3=>"March",4=>"April",5=>"May",6=>"June",7=>"July",8=>"August",9=>"September",10=>"October",11=>"November",12=>"December"},
 %% get number of days for month 1
 #{1 := Days} = MonthDays,
 io:fwrite("~p~n", [Year]),
 io:fwrite("~p~n", [Days]).

如果要映射从 1 开始的连续整数的小序列,则可以使用元组而不是映射并使用element函数访问相应的值:

> MonthNames = {jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec}.
{jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec}
> MonthNumber = 2.
2
> element(MonthNumber, MonthNames).
feb

有一些您可能会发现有用的库函数,例如calendar:last_day_of_the_month/2calendar:day_of_the_week/3

> calendar:last_day_of_the_month(2020, 2).
29
> calendar:day_of_the_week(2021, 2, 17).
3

推荐阅读