-> IO.puts("Echo message: #{msg}") _ -> IO.-6ren">
gpt4 book ai didi

erlang - 二进制类型的模式匹配不能使用变量的值

转载 作者:行者123 更新时间:2023-12-02 08:43:03 29 4
gpt4 key购买 nike

例如:

arg = "echo:hello"
prefix = "echo"

case arg do
<<^prefix, ":", msg::binary>> -> IO.puts("Echo message: #{msg}")
_ -> IO.puts("No match")
end

结果:不匹配

如果我想使用 prefix 的值作为模式匹配怎么办?

最佳答案

这不起作用,因为如果不匹配字符串的“其余部分”,则只能匹配固定大小的二进制文件。根据您的用例,有 3 种不同的解决方案

1。预先计算大小

如果您确实想使用二进制模式匹配,您可以预先手动计算大小:

arg = "echo:hello"
prefix = "echo"
prefix_size = byte_size(prefix)

case arg do
<<^prefix::binary-size(prefix_size), ":", msg::binary>> -> IO.puts("Echo message: #{msg}")
_ -> IO.puts("No match")
end

2。使用编译时模块属性

根据您的用例,您可以使用模块属性,其大小在编译时已知,因此它们可以工作:

defmodule MyModule do

@prefix "echo"

def test(arg) do
case arg do
<<@prefix::binary, ":", msg::binary>> -> IO.puts("Echo message: #{msg}")
_ -> IO.puts("No match")
end
end
end

3。使用 String.replace_prefix/3

或者,如果您想保留运行时二进制文件的前缀,您可以使用String.replace_prefix/3

arg = "echo:hello"
prefix = "echo"

case String.replace_prefix(arg, "#{prefix}:", "")do
^arg -> IO.puts("No match")
msg -> IO.puts("Echo match: #{msg}")
end

String.replace_prefix/3 如果没有找到匹配项,则返回输入字符串,因此我们通过 ^arg 进行匹配。如果情况并非如此,我们就得到了匹配项,并且由于我们用 "" 替换了前缀,因此我们只得到 : 之后的部分。

关于erlang - 二进制类型的模式匹配不能使用变量的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51901240/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com