Elixir 《长生不老药》中的惯用类型转换
我经常遇到这样的情况:为了正确地访问/转换数据,我必须以to_x函数的形式使用多个管道类型转换 例如Elixir 《长生不老药》中的惯用类型转换,elixir,Elixir,我经常遇到这样的情况:为了正确地访问/转换数据,我必须以to_x函数的形式使用多个管道类型转换 例如 这似乎过于冗长。这是惯用的还是我在这里遗漏了一些基本的东西?我知道这是一个人为的例子,但是如果您需要多个类型转换,那么很可能是做错了。选项是选择适当的类型并在应用程序中使用它们 无论是否仍要执行许多管道转换,请为它们声明宏: defmacro to_chars(arg) do quote bind_quoted: [arg: arg] do arg |> to_string |
这似乎过于冗长。这是惯用的还是我在这里遗漏了一些基本的东西?我知道这是一个人为的例子,但是如果您需要多个类型转换,那么很可能是做错了。选项是选择适当的类型并在应用程序中使用它们 无论是否仍要执行许多管道转换,请为它们声明宏:
defmacro to_chars(arg) do
quote bind_quoted: [arg: arg] do
arg |> to_string |> to_charlist
end
end
并使用它们:
IO.puts System.argv
|> to_chars
|> Enum.intersperse(32)
|> Enum.dedup
我知道这只是一个例子,但是你应该使用正确的函数。在此特定示例中,您可以执行以下操作
System.argv()
|> Enum.join(" ")
|> IO.puts()
这将阻止您进行转换,并且仍然会得到预期的结果。我使用的示例旨在在第一个参数中的每个字符之间插入空格。如果不清楚,很抱歉。您的示例在所有参数中的每个字符之间都放置了空格。我想你是想在两个论点之间留出一点距离。但我的观点仍然成立,您通常不需要进行这么多转换。通常有一些函数可以在您已经拥有的类型上执行您正在执行的操作。为什么在这里使用宏而不是普通函数?@Dogbert使其在guards中可用。但是guards中既不允许to_string,也不允许to_charlist。我刚刚实现了GuardEmpty?对于任意输入,我的大脑会自动读取is_uu而不是to_uu,即使这些名称不同。这里做的功能完全适合,绝对正确。
System.argv()
|> Enum.join(" ")
|> IO.puts()