2017-03-29 2 views
0

Wie ist es möglich, den Pipeline-Platzhalter an das zweite Argument in einer Funktion zu übergeben?Pipeline- und Platzhalterargumente

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/, " ", []) 
+0

Sie können einfach die integrierte ['Macro.camelize/1'] (https://hexdocs.pm/elixir/Macro.html#camelize/1) verwenden, wenn das alles ist, was Sie tun möchten – Sheharyar

+0

Hey @Sheharyar, ich stimme zu, es war mehr, als nur mit Elixir-Pipelines zu üben. –

Antwort

3

Um die Zeichenfolge als zweites Argument übergeben Rohre verwenden Sie anonyme Funktion verwenden können:

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

Aber für diesen speziellen Fall können Sie String.replace/3 stattdessen verwenden, die einen String als erstes Argument akzeptiert und Regex als zweites Argument:

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

(\W nicht _ überein, so habe ich es für Demozwecke .)

+0

Danke am Ende der anonymen Funktion.() Wird diese Funktion gerade aufgerufen? –

+1

Mit dem abschließenden '.()' Wird die anonyme Funktion mit einem Argument aufgerufen: Der Wert wird über die Pipe übergeben. – Dogbert

Verwandte Themen