0

有人可以帮我理解这段 Erlang 代码吗

to_price_file(Line, OutputFile) ->
  Fields = csv:parse_line(Line),
  [SupplierID, ProductCode, Description, DeliveryDate, CostPrice, UnitCount] = Fields,
  Product = calculate_product(list_to_integer(SupplierID),list_to_integer(ProductCode),
                              Description, **date_utils:parse_date(DeliveryDate)**,
                              list_to_integer(CostPrice), list_to_integer(UnitCount)),
  ok = write_pricefile(Product, OutputFile),
  ok.

调用另一个子函数 parse_date(如下)。

parse_date(DateString) ->
  Tokens = string:tokens(DateString, "/"),
  **[Year, Month, Day] = [list_to_integer(Str) || Str <- Tokens],
  {Year, Month, Day}.**

我不明白,粗体字母的命令在子功能中做了什么。

谢谢, 阿尼什

4

1 回答 1

6

该函数parse_date/1假定日期字符串的格式为"Year/Month/Day"

parse_date(DateString) ->
    Tokens = string:tokens(DateString, "/"),
    [Year, Month, Day] = [list_to_integer(Str) || Str <- Tokens],
    {Year, Month, Day}.

它首先调用string:tokens/2其中返回的单独字段列表,"/"是分隔符字符串。然后它对调用中的每个元素进行列表推导并返回值列表。然后它使用模式匹配将列表拆分为单独的部分,并返回一个包含值的元组。示例运行中的变量值可能是:Tokenslist_to_integer/1

DateString = "2013/03/08"
Tokens = ["2013","03","08"]
[Year,Month,Date] = [2013,3,8]
{2013,3,8}

列表推导式非常常见,并且通常是一种非常简洁的方式,可以将操作应用于列表中的每个元素,例如lists:map/2,带有过滤选项(此处未使用)。

请注意,在 ISO 标准中,日期应写为 2013-03-08。:-)

于 2013-03-08T10:37:30.043 回答