如何使用 Elixir 模式匹配来检查列表的项目是否以给定字符串(在变量中)开头?

问题描述 投票:0回答:1

我是 Elixir 的新手,我想收集以给定字符串开头的列表中的所有项目。如果我将字符串硬编码为

<>
运算符的左侧,则程序可以正常工作,否则我会收到错误
ArgumentError the left argument of <> operator inside a match should be always a literal binary as its size can't be verified.

defmodule StringStartsWith do
  def search([]), do: []
  def search(["Case"<> head | tail]), do: ["Case" <> head] ++ search(tail)
  def search([_head | tail]), do: search(tail)
end

StringStartsWith.search(["CaseDown", "YoHua", "CaseUp"])
|> IO.puts()

我想知道如何使用变量作为

<>
运算符的左侧,该运算符将保存起始子字符串的值。带有一些解释的解决方案将真正帮助我的案例。

干杯, DD

elixir pattern-matching
1个回答
0
投票

不能使用变量作为

<>
运算符的左参数来以这种方式进行匹配。这就是错误消息试图告诉您的内容:

匹配中<>运算符的左参数应始终是文字二进制,因为其大小无法验证

强调我的。

另一种方法是使用

String.starts_with?/1
:

def search(list, start) do
  Enum.filter(list, &String.starts_with?(&1, start))
end

这适用于变量:

iex> StringStartsWith.search(["CaseDown", "YoHua", "CaseUp"], "Case")
["CaseDown", "CaseUp"]
© www.soinside.com 2019 - 2024. All rights reserved.