怎么做|>长生不到的管道操作员工作?

时间:2017-01-11 07:09:23

标签: elixir

这与在unix上使用|运算符类似吗?根据{{​​3}},它是关于将第一个参数传递给函数,所以想知道这个运算符的重要性与传统方式在Pascal或C等任何函数语言中传递第一个参数相比。

另外,我们可以用这种方式传递变量参数吗?

2 个答案:

答案 0 :(得分:9)

管道运算符的主要好处是不是以嵌套方式调用多个函数

Enum.join(Enum.map(String.split("hello, world!", " "), &String.capitalize/1), " ")

或有许多中间“丢失变量”

string = "hello, world!"
words = String.split(string, " ")
capitalized_words = Enum.map(words, &String.capitalize/1)
Enum.join(capitalized_words, " ")

您可以使用管道运算符编写

"hello, world!"
|> String.split(" ")
|> Enum.map(&String.capitalize/1)
|> Enum.join

最值得注意的是,参数现在非常接近接收它们的函数。此外,代码中函数调用的顺序类似于执行的顺序 - 从上到下而不是从内到外读取。最后,没有不必要的“丢失变量”会降低噪音。

它不仅使您的代码更易于阅读,而且还会对您设计API的方式产生积极影响。它鼓励您将您的代码视为一系列数据转换,这在很多情况下会产生非常干净的解决方案。

  

另外,我们可以用这种方式传递变量参数吗?

不,你不能以这种方式传递多个参数 - 虽然你可以使用一个元组,例如,通过一个参数传递多个值。

答案 1 :(得分:3)

  

这与在unix上使用|运算符类似吗?

不完全是。请考虑以下示例:

echo 'foo' | echo 'bar'
#⇒ bar

使用Elixir管道操作符,我们将打印出foo bar字符串。

如果你想与unix管道进行比较,它更像| xargs,保存xargs追加给定命令的标准输入(追加< / em>上一个命令的输出,当在管道之后使用时),而Elixir管道操作符将预先添加上一个命令的输出。

  

与传统的传递第一个参数的方式

相比,这个运算符有什么大不了的

嗯,这是维护可读代码的问题。考虑以下任务:一个应该从标准输入接收参数,验证它们,可能将它们强制转换为相应的类型,然后执行操作,将这些参数作为输入。在Elixir中,我们使用管道运算符编写:

input
|> validate(ValidatorEngine)
|> coerce(to: [:int, :float])
|> perform

如果没有此运算符,则完全相同的代码如下所示:

perform(coerce(validate(input, ValidatorEngine), to: [:int, :float]))

什么更具可读性,可维护性,毕竟优雅?

  

在任何函数语言中,如Pascal或C

PascalC都不是功能。这些语言是命令式。与“有功能”相比,这两者相关的是“开心”。

  

我们可以用这种方式传递变量参数吗?

很容易检查Elixir代码库:Macro.unpipe取消管道foo |> bar |> baz符号内部没有魔法。因此,不,人们不能只是根据他们想要的方式管道。无论什么时候需要,都可以使用元组/列表/映射结构将前一个命令的输出包装到单个术语中。