这与在unix上使用|
运算符类似吗?根据{{3}},它是关于将第一个参数传递给函数,所以想知道这个运算符的重要性与传统方式在Pascal或C等任何函数语言中传递第一个参数相比。
另外,我们可以用这种方式传递变量参数吗?
答案 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
Pascal
和C
都不是功能。这些语言是命令式。与“有功能”相比,这两者相关的是“开心”。
我们可以用这种方式传递变量参数吗?
很容易检查Elixir代码库:Macro.unpipe
取消管道foo |> bar |> baz
符号内部没有魔法。因此,不,人们不能只是根据他们想要的方式管道。无论什么时候需要,都可以使用元组/列表/映射结构将前一个命令的输出包装到单个术语中。