管道和占位符参数

Dav*_*oss 0 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/, " ", [])
Run Code Online (Sandbox Code Playgroud)

Dog*_*ert 5

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

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

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

iex(2)> "The_Stealth_Warrior" |> String.replace(~r/_/, "")
"TheStealthWarrior"
Run Code Online (Sandbox Code Playgroud)

\W不匹配,_因此我出于演示目的对其进行了更改。)