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,我经常遇到这样的情况:为了正确地访问/转换数据,我必须以to_x函数的形式使用多个管道类型转换 例如 这似乎过于冗长。这是惯用的还是我在这里遗漏了一些基本的东西?我知道这是一个人为的例子,但是如果您需要多个类型转换,那么很可能是做错了。选项是选择适当的类型并在应用程序中使用它们 无论是否仍要执行许多管道转换,请为它们声明宏: defmacro to_chars(arg) do quote bind_quoted: [arg: arg] do arg |> to_string |

我经常遇到这样的情况:为了正确地访问/转换数据,我必须以to_x函数的形式使用多个管道类型转换

例如


这似乎过于冗长。这是惯用的还是我在这里遗漏了一些基本的东西?

我知道这是一个人为的例子,但是如果您需要多个类型转换,那么很可能是做错了。选项是选择适当的类型并在应用程序中使用它们

无论是否仍要执行许多管道转换,请为它们声明宏:

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()