2017-12-01 15 views
1

Lassen Sie uns sagen, dass ich eine Funktion bin Prüfung zu Utils Modul gehört, wie dieserElixir Umbenennungs importierte Funktion alias

defmodule Test do 
    alias Module.Utils 

    test "test 1" do 
    Utils.some_function?(...) 
    end 

    test "test 2" do 
    Utils.some_function?(...) 
    end 
end 

Kann ich Refactoring oder diese Funktion in etwas vereinfachen wie:

import Utils.some_function as test_func() 

Also nicht ich muss den Modulnamen schreiben und den Funktionsnamen vereinfachen

Antwort

4

Sie können eine Funktion beim Importieren nicht umbenennen.

Sie können defdelegate eine lokale Funktion erstellen, die eines anderen Moduls Funktion wie diese Anrufe:

defmodule A do 
    def just_add_these_two_numbers(a, b), do: a + b 
end 

defmodule B do 
    defdelegate add(a, b), to: A, as: :just_add_these_two_numbers 
    # `add/2` is now the same as `A.just_add_these_two_numbers/2`. 

    def test do 
    IO.inspect add(1, 2) == 3 
    end 
end 

B.test #=> true 

Obwohl Sie könnte genauso gut nur das tun, statt (es ist sogar noch kürzer):

def add(a, b), do: A.just_add_these_two_numbers(a, b) 
+0

Hallo Wenn Sie den Parameter a immer gleich kennen, können Sie ihn innerhalb des defdelegate definieren und dann einfach den Parameter "b" in den restlichen Tests hinzufügen? – lapinkoira

+0

Nein, 'defdelegate' erlaubt dies nicht. Selbst wenn es so wäre, wäre es viel kürzer, einfach 'def add5 (b) zu machen, tun Sie: A.just_add_these_two_numbers (5, b) 'und benutzen Sie das. Auf diese Weise können Sie die neue Funktion auch privat machen, indem Sie 'defp' machen. – Dogbert

+0

danke, und können Sie diese Zahl 5 (5, b) als eine Variable in einer Zeile vor dem Def-Add (a, b), tun: A.just_add_these_two_numbers (a, b)? oder der innere Bereich der Add-Methode wird es nicht sehen? – lapinkoira