2010-07-22 9 views
6

मैंने एक एरलांग मॉड्यूल लिखा जहां सभी आंतरिक कार्यों को सीधे नहीं कहा जाता है। इसके बजाए, कुछ ऐसे कार्य हैं जो इस तरह कुछ दिखते हैं:एरलांग "अप्रयुक्त फ़ंक्शन" चेतावनियों को दबाकर

weird_func(Cmd, Args) -> 
    ?MODULE:Cmd(Args). 

यह एक सरल उदाहरण है, लेकिन आपको विचार मिलता है। Erlang संकलक अप्रयुक्त कार्यों के बारे में चेतावनी थूकता है, जब वास्तव में वे वास्तव में उपयोग किया जाता है, बस सीधे नहीं। क्या इन चेतावनियों को दबाने का कोई तरीका है? आदर्श रूप में मैं ऐसी सभी चेतावनियों को दबाना नहीं चाहता हूं, बल्कि मैं विशेष मामलों के रूप में कुछ विशिष्ट कार्यों पर विचार करने के लिए एर्लांग कंपाइलर को बताना चाहता हूं।

+2

है कि रास्ते में एक समारोह कॉलिंग केवल काम करेंगे अगर यह निर्यात किया गया है के लिए उपयोगी हो सकता है। यदि आप 'MODULE'' का उपयोग करते हैं, तो आप वास्तव में "बाहरी" कॉल कर रहे हैं, जो केवल एक पूर्वनिर्धारित मैक्रो है जो मॉड्यूल नाम तक फैलता है, और फ़ंक्शन नाम को तर्क के रूप में पास करता है। N.B. कि 'Args' तर्कों की एक सूची होगी और बुलाए गए फ़ंक्शन में केवल एक तर्क होगा। – rvirding

उत्तर

6

यदि कोई फ़ंक्शन न तो निर्यात किया जाता है, और न ही स्पष्ट रूप से कहा जाता है, तो इसे अप्रयुक्त के रूप में रिपोर्ट किया जाता है। तो आपके पास जाने के दो तरीके हैं:

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

2) weird_func में स्पष्ट रूप से प्रत्येक कार्य कॉल (और टिप्पणियों में।):

weird_func(fun1, [A1,A2]) -> 
    fun1(A1, A2); 
weird_func(fun2, []) -> 
    fun2(); 
weird_func(fun3, [A1,A2,A3]) -> 
    fun3(A1,A2,A3). 

यह उत्तरार्द्ध थोड़ा और वर्बोज़ है, लेकिन यह उपयोगकर्ताओं के लिए बेहतर त्रुटि प्रदान करेगा, अगर वे एक गैर-मौजूदा फ़ंक्शन

+1

मुझे लगता है 2) एक विकल्प नहीं है जब आप {weird_result} -> spawn (? MODULE, fun1, [params]) का उपयोग करते हैं; – Daniel

11

यह चेतावनी को दबाने का मामला नहीं है। आपके इच्छित इरादे से एक अप्रत्याशित फ़ंक्शन नहीं कहा जा सकता है।

-module(foo). 
-export([f/0]). 
f() -> ?MODULE:g(). 
g() -> ok. 

1> c(foo). 
./foo.erl:4: Warning: function g/0 is unused 
{ok,foo} 
2> foo:f(). 
** exception error: undefined function foo:g/0 

कंपाइलर अप्रयुक्त, अप्रत्याशित फ़ंक्शन को पूरी तरह से छोड़ने के लिए स्वतंत्र है। बस मॉड्यूल का उपयोग कर उपलब्ध कॉल बनाने के फ़ंक्शन को निर्यात करें? मॉड्यूल: एफ सिंटैक्स।

2

आपके मूल रूप से दो विकल्प हैं।

पहला कार्यों को निर्यात करना है, इस प्रकार उन्हें "उपयोग" करना। आपके मूल उदाहरण के लिए काम करना भी जरूरी है।

2 स्थानीय स्तर पर की तरह कुछ का उपयोग कर कार्यों कॉल करने के लिए है: (।। ध्यान दें कि मेरे उदाहरण संकलन नहीं है आप पर निर्भर करते हुए समारोह आप बुला रहे हैं टुकड़ों में args तर्क विभाजित करने के लिए है)

weird_func(Cmd, Args) -> 
    case Cmd of 
     func1 -> func1(Arg1, Arg2, Arg3); 
     func2 -> func2(Arg1); 
     ... 

अपने उदाहरण डालने विज्ञापन के लिए

http://www.erlang.org/doc/man/compile.html

हां, तो:

+0

मुझे लगता है कि पैटर्न मिलान का उपयोग इस मामले में बेहतर है: 'weird_func (func1, Args) -> ...; weird_func (func2, Args) -> ...; ' –

12

इसके लिए विशेष रूप से एक संकलन विकल्प है इस तरह irective:

-compile([{nowarn_unused_function, [{ wierd_function_1,Arity1 }, 
             ... ]}]). 

लेकिन संकलक चुपचाप कार्यों को त्यागकर के बारे में ऊपर चेतावनी अभी भी खड़ा है जहाँ तक मुझे पता है।

1

तुम भी fun func1/3 प्रारूप में Cmd पारित कर सकते हैं, उदाहरण के लिए:

weird_func(fun func1/3, [1, 2, 3])

इस तरह समारोह गिरा नहीं किया जाएगा।

संपादित करें: बस मेरी टिप्पणी की है, तो यह भविष्य पाठकों

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