Functional programming 长生不老药:将多个变量导入函数

Functional programming 长生不老药:将多个变量导入函数,functional-programming,pipe,elixir,Functional Programming,Pipe,Elixir,Elixir可以将输入管道化到函数中,这使得代码通常更具可读性 举个例子 sentence |> String.split(@wordSplitter, trim: true) 它将字符串语句导入String.split的第一个参数 现在我还想把第二个参数转换成字符串。在长生不老药中有这样做的可能性吗?我的意思是这样的: sentence, @wordSplitter |> String.split(trim: true) 谢谢 正如@Dogbert所指出的,这是不可能的。不过

Elixir可以将输入管道化到函数中,这使得代码通常更具可读性

举个例子

sentence  |> String.split(@wordSplitter, trim: true)
它将字符串
语句
导入
String.split的第一个参数

现在我还想把第二个参数转换成<代码>字符串。在长生不老药中有这样做的可能性吗?我的意思是这样的:

sentence, @wordSplitter |> String.split(trim: true)

谢谢

正如@Dogbert所指出的,这是不可能的。不过,助手非常简单:

defmodule MultiApplier do
  def pipe(params, mod, fun, args \\ []) do
    apply(mod, fun, List.foldr(params, args, &List.insert_at(&2, 0, &1)))
  end
end

iex> ["a b c", " "]
...> |> MultiApplier.pipe(String, :split, [[trim: true]]) 
#⇒ ["a", "b", "c"]

iex> ["a b c", " ", [trim: true]]
...> |> MultiApplier.pipe(String, :split, [])             
#⇒ ["a", "b", "c"]

iex> ["a b c"]
...> |> MultiApplier.pipe(String, :split, [" ", [trim: true]])   
#⇒ ["a", "b", "c"]

正如@Dogbert所指出的,这是不可能开箱即用的。不过,助手非常简单:

defmodule MultiApplier do
  def pipe(params, mod, fun, args \\ []) do
    apply(mod, fun, List.foldr(params, args, &List.insert_at(&2, 0, &1)))
  end
end

iex> ["a b c", " "]
...> |> MultiApplier.pipe(String, :split, [[trim: true]]) 
#⇒ ["a", "b", "c"]

iex> ["a b c", " ", [trim: true]]
...> |> MultiApplier.pipe(String, :split, [])             
#⇒ ["a", "b", "c"]

iex> ["a b c"]
...> |> MultiApplier.pipe(String, :split, [" ", [trim: true]])   
#⇒ ["a", "b", "c"]

不,此语法仅适用于一个参数。您可以通过管道传输元组列表-第一个元组包含您想要的任何参数。如果有帮助的话。否,此语法仅适用于一个参数。您可以通过管道传输元组列表-第一个元组包含您想要的任何参数。如果有帮助的话。为什么不干脆用
params++args
而不是
List.foldr(params,args和List.insert_at(&2,0和1))
?@Dogbert来演示方法。基本上,调整这段代码可以很容易地将参数嵌入到参数的任何所需位置。对于反向顺序,可以使用
List.foldl/3
等。对于最简单的情况,
++
当然可以。为什么不使用
params++args
而不是
List.foldr(params,args,&List.insert_at(&2,0,&1))
?@Dogbert来演示该方法。基本上,调整这段代码可以很容易地将参数嵌入到参数的任何所需位置。对于相反的顺序,可以使用
List.foldl/3
等。对于最简单的情况,
++
当然可以。