简化嵌套字符串解析:Elixir实现字符串转两个整数列表
问题描述
我尝试将以下格式的字符串解析为两个整数列表:
69 12 75 19 83 56 73 53 52 91 | 83 63 56 30 77 94 12 81 42 69 52 70 6 97 20 43 61 22 75 19 73 32 74 53 91
以下代码可实现需求,但存在中间变量赋值:
[results_s, owned_s] = data_string |> String.split("|") |> Enum.map(&String.trim/1) |> Enum.map(&String.split(&1, ~r/\s+/)) results = results_s |> Enum.map(&String.to_integer/1) owned = owned_s |> Enum.map(&String.to_integer/1)
我希望避免中间变量,尝试了两种写法均出错:
第一种写法出现嵌套捕获错误:
[results_s, owned_s] = data_string |> String.split("|") |> Enum.map(&String.trim/1) |> Enum.map(&String.split(&1, ~r/\s+/)) |> Enum.map(&Enum.map(&1, &String.to_integer/1))
第二种写法出现函数子句匹配错误:
[results_s, owned_s] = data_string |> String.split("|") |> Enum.map(&String.trim/1) |> Enum.map(&String.split(&1, ~r/\s+/)) |> Enum.map(fn (left, right -> { left |> Enum.map(&String.to_integer/1), right |> Enum.map(&String.to_integer/1) } end)
错误信息如下:
解析:Card 1: 69 12 75 19 83 56 73 53 52 91 | 83 63 56 30 77 94
12 81 42 69 52 70 6 97 20 43 61 22 75 19 73 32 74 53 91
** (FunctionClauseError) 无匹配的匿名fn/1函数子句在CardParser.parse_card/1中传递给CardParser.parse_card/1中匿名fn/1的参数为: # 1 ["69", "12", "75", "19", "83", "56", "73", "53", "52", "91"]
请问该如何实现无中间变量的解析?
解决方案
要实现无中间变量的解析,可将字符串分割、转换的逻辑合并到同一个管道中,直接将分割后的每一组字符串列表转换成整数列表,再解构赋值给两个变量。
正确写法如下:
[results, owned] = data_string |> String.split("|") |> Enum.map(fn part -> part |> String.trim() |> String.split(~r/\s+/) |> Enum.map(&String.to_integer/1) end)
错误原因解释
- 第一种写法的问题:Elixir 不支持嵌套的捕获符号
&写法,&Enum.map(&1, &String.to_integer/1)无法被正确解析,必须显式使用匿名函数拆分逻辑。 - 第二种写法的问题:
Enum.map接收的匿名函数仅能接受一个参数,但你定义了接收两个参数的函数fn (left, right -> ...),而Enum.map每次迭代只会传入分割后的单个字符串列表,导致函数子句匹配失败。
内容的提问来源于stack exchange,提问作者ScottishTapWater
相关产品推荐
相关产品推荐

