管道和占位符参数

时间:2017-03-29 20:03:29

标签: elixir

如何将管道占位符传递给函数中的第二个参数?

defdefmodule CamelCase do
  str = "The_Stealth_Warrior"
  def to_camel_case(str) do 
    str 
    |> Regex(~r/_/, 'need_to_pass_str_argument_here', "") 
    |> String.split(" ")
    |> Enum.map(&(String.capitalize(&1)))
    |> List.to_string   
  end
end


ExUnit.start 

defmodule TestCamelCase do
  use ExUnit.Case
  import CamelCase, only: [to_camel_case: 1]

  test "to_camel_case" do
    assert to_camel_case("The_Stealth_Warrior") == "TheStealthWarrior"
  end
end

# Error 
iex> 
  ** (FunctionClauseError) no function clause matching in Regex.replace/4
  (elixir) lib/regex.ex:504: Regex.replace("The_Stealth_Warrior", ~r/\W/, " ", [])

1 个答案:

答案 0 :(得分:4)

要使用管道将字符串作为第二个参数传递,您可以使用匿名函数:

iex(1)> "The_Stealth_Warrior" |> (fn s -> Regex.replace(~r/_/, s, "") end).()
"TheStealthWarrior"

但是,对于这种特定情况,您可以使用String.replace/3代替String接受String作为第一个参数,将Regex作为第二个参数:

iex(2)> "The_Stealth_Warrior" |> String.replace(~r/_/, "")
"TheStealthWarrior"

\W_不符,因此我将其更改为演示目的。)