2016-07-04 4 views
5

में अंतर क्या है मेरे पास मॉड्यूल है जिसका उपयोग ज्यादातर नामस्थान के रूप में किया जाता है। आइए इसे Bla पर कॉल करें। अन्य submodules हैं, जिनमें उस सबमिशन के लिए विशिष्ट कार्यों के साथ विधियां हैं।डिलीडिगेट और डीएल मॉड्यूल फ़ंक्शन के साथ डिफ़ॉल्ट रूप से एलिक्सीर

1) मुख्य मॉड्यूल Bla आयात और submodules से सभी कार्यों का उपयोग सीधे (एकाधिक आयात अलग से लिखने के लिए नहीं)

Bla.Subbla तरह

2) आयात केवल विशिष्ट submodule:

हालांकि, मैं दो विकल्प हैं करना चाहते हैं अन्य submodules से कार्यों आयात किए बिना ही इस मॉड्यूल से कार्यों का उपयोग करने के लिए

यह है कि मैं क्या है:

defmodule Bla do 
    defdelegate bla_func(text), to: Bla.Subbla 
    defdelegate bla_func(text, opts), to: Bla.Subbla 
end 

defmodule Bla do 
    def bla_func(text), do: Bla.Subbla.bla_func(text) 
    def bla_func(text, opts), do: Bla.Subbla.bla_func(text, opts) 
end 

ऐसा करने का सही तरीका क्या है? मेरे पास दो विकल्प हैं, लेकिन कोई जानकारी नहीं है, शायद, एक और बेहतर है। क्या वे दो विकल्प बराबर हैं? और कौन सा बेहतर है? प्रदर्शन में कोई अंतर है?

+4

मुझे लगता है कि आपको 'उपयोग' का उपयोग करने पर विचार करना चाहिए और आप जो आयात करना चाहते हैं उसके बारे में विकल्प पास करना चाहिए। – JustMichael

+0

अच्छा लगता है, इस विकल्प के बारे में पढ़ा जाएगा (मैं बस सीख रहा हूं - इस समय इतना नहीं जानता) – kovpack

उत्तर

4

कुछ मतभेद मैं के बारे में सोच सकते हैं:

  1. आप defdelegate अपने अभिप्राय का उपयोग करते रहे हैं बहुत स्पष्ट है, तो आप सिर्फ एक और मॉड्यूल में एक और तरीका करने के लिए विधि सौंपने कर रहे हैं। और यह सिर्फ एक गूंगा फॉरवर्डर है।
  2. defdelegate के साथ आप arguments नहीं बदल सकते हैं, भले ही यह आदेश, जोड़ या तर्कों को हटाया जाए। इसलिए, यदि आप वास्तव में चाहते हैं कि विधि कॉल का उपयोग defdelgate को आगे बढ़ाना है क्योंकि स्क्रू करने के लिए कम गुंजाइश है।
  3. कुछ मामलों में defdelegate एक विकल्प नहीं है क्योंकि आपको अग्रेषण फ़ंक्शन में अधिक डेटा जोड़ने की आवश्यकता है, इस स्थिति में आपके पास वास्तव में कोई विकल्प नहीं है।

तो, नीचे की रेखा है: यदि संभव हो तो हमेशा defdelegate का उपयोग करें, आप इसका उपयोग कर बग के कुछ वर्गों से बचेंगे। जैसे नीचे:

defmodule Greet do 
    def greet(name, greeting) do 
    IO.puts "#{greeting} #{name}" 
    end 
end 

defmodule DelegatedGreet do 
    defdelegate greet(name, greeting), to: Greet 
end 

defmodule BuggyGreet do 
    # scope for bugs like these 
    def greet(name, greeting), do: Greet.greet(greeting, name) 
end 
2

@JustMichael के रूप में, इस मामले में use का उपयोग करना अच्छा है। यह वही करता है जो मुझे चाहिए।

defmodule SomeModuleWhereINeedSubbla do 
    use Bla 

    useful_func # => Will print "Bla.Subbla.useful_func" 
end 

defmodule Bla do 
    defmacro __using__(_) do 
    quote do 
     import Bla.Subbla 
    end 
    end 
end 

defmobule Bla.Subbla do 
    def useful_func(), do: IO.puts "Bla.Subbla.useful_func" 
end 
+1

यह उत्तर एक विकल्प के रूप में स्वीकार किया जाता है, लेकिन यह मूल प्रश्न का उत्तर नहीं देता है। –

+0

हाँ, वास्तव में, यह एक जवाब नहीं है। अगर आप जवाब जानते हैं तो सुनना अच्छा लगेगा :) – kovpack

संबंधित मुद्दे