Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何操作Elixir中枚举字符列表中的单个字符?_Elixir - Fatal编程技术网

如何操作Elixir中枚举字符列表中的单个字符?

如何操作Elixir中枚举字符列表中的单个字符?,elixir,Elixir,假设我想通过组合符(如filter)传递枚举字符列表,以便删除所有a,如下所示: 'abc' |> Enum.filter(fn ch -> ch != 'a' end) 这不会返回预期结果,因为枚举字符实际上是代码点,这里是97、99和99。因此谓词可以表示为ch!=97或!=“a”以实现所需的结果。 在这种情况下,是否有更好、更直观的方式来表达谓词?您可以使用?来表达: iex(1)> 'abc' |> Enum.filter(fn ch -> ch != ?

假设我想通过组合符(如
filter
)传递枚举字符列表,以便删除所有a,如下所示:

'abc' |> Enum.filter(fn ch -> ch != 'a' end)
这不会返回预期结果,因为枚举字符实际上是代码点,这里是97、99和99。因此谓词可以表示为
ch!=97
!=“a”
以实现所需的结果。

在这种情况下,是否有更好、更直观的方式来表达谓词?

您可以使用
来表达:

iex(1)> 'abc' |> Enum.filter(fn ch -> ch != ?a end)
'bc'

你也可以反过来做:

'abc' |> Enum.filter(fn ch -> [ch] != 'a' end)

尽管我更喜欢使用
?a
,而且我更喜欢使用二进制文件而不是字符列表。

如果谓词是正则表达式,您会如何编写?例如,
String.match?(*这里是什么?*,~r/[bc]/)
?还是别的?我不确定我是否理解这个问题。你想得到所有与正则表达式匹配的字符吗?如果是,我将使用Regex.scan(~r/[bc]/,“abcbd”)。请注意双引号-Regex仅适用于二进制字符串。如果您有一个字符表,只需通过to_string/1将其转换为二进制即可。我的问题是,当
选项不可用时,
选项如何将代码点转换为字符串,因为您希望与正则表达式匹配。但这可能不是很常见的情况。好吧,您可以随时执行类似于[codepoint]|>的操作来创建字符串。但是如前所述,如果您需要正则表达式匹配单个字符,那么我只需对整个字符串执行regex.scan。我认为Sasa的答案与大多数Elixir开发人员编写类似于您上面概述的代码的规范/惯用方式基本相同。