2016-03-27 20 views
2

Diyelim ki farklı işlevlere sahip kafaları olan bir fonksiyona sahip bir modülüm var. Bu işlevi, mevcut tüm yapılar için (açık olmadan) başka bir modülde içe aktarmanın bir yolu var mı?Herhangi bir varlığa ait bir işlevi alabilir miyim?

defmodule Math do 
    def plus(a, b) do 
    end 

    def plus(a, b, c) do 
    end 

    def plus(a, b, c, d) do 
    end 
end 

defmodule AdditiveCalculator do 
    # Explicit import 
    import Math, only: [plus: 2, plus: 3, plus: 4] 

    # What i'm hoping for 
    import Math, only: [plus: :all] 
end 
+1

Erlang/Elixir'de değişken miktarda argüman yoktur. Daha uzun değer listelerini toplamaya ihtiyacınız varsa, değer listesini işleve iletin. Bu "tümünü içe aktar" ihtiyacını ortadan kaldırır. – tkowal

+0

Tabii ki tüm fonksiyonları istiyorsanız, sadece 'import Math' 'i kullanın ve '': 'seçeneğini kullanmayın. Bu size modüldeki tüm fonksiyonları verecek, ki tam olarak ne istediğini düşünmüyorum, ama işe yarayacaktı. – CoderDennis

cevap

2

Bildiğim kadarıyla, Elixir'de böyle bir işlev yoktur.

Daha fazla ayrıntı için here adresine bakın.


DÜZENLEME:

@tkowal yukarıdaki yorumunda büyük bir noktaya getirir. Eğer tamsayıların değişken listelerini toplamlamaya çalışıyorsanız, doğru yaklaşım argümanı bir tamsayılar listesi olarak iletmek ve sonra bununla çalışmaktır. böylece gibi:

defmodule T do 
    def plus(l) when is_list(l), do: plus(l,0) 
    defp plus([], acc), do: acc 
    defp plus([item] = l, acc), do: acc + item 
    defp plus([head|tail] = l, acc), do: plus(tail, acc+head) 
end 

Sonra kullanmak için, böyle diyoruz:

T.plus([1,2,3,4]) 
#=> 10 
+0

Gerçekten 'defp plus' a ihtiyacınız var mı? ([Item] = l, acc), do: acc + item 'maddesi? Tek bir liste listesindeki 'kuyruk' boş liste olacak, bu yüzden diğer maddeler tüm senaryoları kapsayacak, değil mi? – CoderDennis

+1

Bu iyi bir nokta @ CoderDennis. Bunu iki kez kontrol etmem gerekecek ama haklı olduğuna inanıyorum. Genelde burada kod yazdığımda, aslında üretim çalışması için kullanacağım bir şeyden ziyade didaktik bir amaç için daha çok yaparım. –

2

Sorunuz Elixir'in işlevler doğası hakkında yanlış bir varsayım yapar. "Farklı bir yapıya sahip kafaları olan bir işleve" ve daha sonra "bu işleve" sahip olduğunuzu söylüyorsunuz.

Birden çok kafa ile tek bir işleviniz yok. Aslında 3 farklı fonksiyon var. Fonksiyonlar hem isim hem de ariteyle tanımlanır. plus/2, plus/3 ve plus/4 bir adı paylaşabilir, ancak aynı işlevde değildirler. Bir import üzerinde only seçeneği belirtirken bunları açıkça dışarı listelemek için ihtiyaç nedeni de budur http://elixir-lang.org/crash-course.html#identifying-functions

bakınız. Bu 3 farklı işlevi modülden alıyorsunuz.

İlgili konular