2011-11-15 18 views
6

मैं लुआ सीख रहा हूं और अज्ञात कार्यों की अवधारणा में आया हूं। यह दिलचस्प है लेकिन मैं सोच रहा था कि गैर अज्ञात कार्यों पर यह अतिरिक्त लाभ प्रदान करता है।बेनामी बनाम गैर बेनामी फ़ंक्शन लुआ

तो अगर मैं की तरह

function(a,b) return (a+b) end 

कुछ है समारोह अनाम है और अगर मैं

function add(a,b) return (a+b) end 

है समारोह गैर अनाम है। दूसरा बेहतर है क्योंकि मैं इसे कहीं भी कह सकता हूं और मुझे यह भी पता है कि मेरा काम क्या कर रहा है। तो अज्ञात कार्यों का क्या फायदा है? क्या मुझसे कोई चूक हो रही है?

+7

आपको इसे पीछे की ओर मिला। एक अधिक उपयोगी मानसिक मॉडल 'फंक्शन एफ (...) ... अंत' को 'स्थानीय f = function (...) ... end' के लिए वाक्य रचनात्मक चीनी के रूप में इलाज कर रहा है, और सामान्य रूप से कार्यों के रूप में वस्तुओं के रूप में सोचता है अपने कार्यक्रम के स्थिर इमारत ब्लॉक के। आप नहीं पूछते कि आप उन्हें पहले एक विस्तृत अंग्रेजी नाम दिए बिना संख्या अक्षर का उपयोग क्यों कर सकते हैं, है ना? – delnan

उत्तर

20

ईमानदार होने के लिए, नामक ऐसी कोई चीज़ नहीं है जिसका नाम लुआ में है। सभी फ़ंक्शन वास्तव में अज्ञात हैं, लेकिन चर में संग्रहीत किया जा सकता है (जिसका नाम है)।

नामित समारोह वाक्य रचना function add(a,b) return a+b end वास्तव में add = function(a,b) return a+b end के लिए एक syntactic sugar है।

people = {{name="John", age=20}, {name="Ann", age=25}} 
table.sort(people, function (a,b) return a.name < b.name end) 

बिंदु: अपने कार्य का उपयोग कर, आप छँटाई आदेश निर्दिष्ट कर सकते हैं -

कार्य अक्सर ईवेंट हैंडलर्स के रूप में और निर्णय जो एक पुस्तकालय/नहीं पता नहीं कर सकते है, सबसे प्रसिद्ध उदाहरण है table.sort() के लिए उपयोग किया जाता है यह है कि शायद आपको बाद में समारोह की आवश्यकता नहीं होगी। बेशक, आप भी एक (संभवतः स्थानीय) अलग-अलग करने के लिए समारोह बचाने के लिए और का उपयोग करें कि कर सकते हैं:

local nameComparator = function (a,b) return a.name < b.name end 
table.sort(people, nameComparator) 

अधिक जानकारी के लिए इस section on functions in PiL पढ़ें।

4

दूसरे उदाहरण तो सच में आप गुमनाम कार्यों का उपयोग कर रहे हर समय, एक छोटी सी अर्थ में
add = function(a,b) return a+b end
के बराबर है।

लेकिन अनाम संदर्भ अन्य संदर्भों में अधिक उपयोगी हो सकते हैं। उदाहरण के लिए, फ़ंक्शन का उपयोग अन्य कार्यों उत्परिवर्तित करने के लिए (कार्यात्मक प्रोग्रामिंग की आत्मा।)

function make_version_with_n_args (func, n) 
    if n == 1 then 
     return function (x) return x end 
    else 
     return function (x, ...) 
      return func (x, make_version_with_n_args (func, n-1)(...)) 
     end 
    end 
end 

add_four = make_version_with_n_args (function (a, b) return a+b end, 4) 

print (add_four(3, 3, 3, 3)) 

add_sizes = {} 
for i = 1, 5 do 
    add_sizes[i] = make_version_with_n_args(function (a, b) return a+b end, i) 
end 

func_args = {} 
for i = 1, 5 do 
    func_args[#func_args+1] = 2 
    print (add_sizes[i](unpack(func_args))) 
end 

function make_general_version (func) 
    return function (...) 
     local args = {...} 
     local result = args[#args] 
     for i = #args-1,1,-1 do 
      result = func(args[i], result) 
     end 
     return result 
    end 
end 

general_add = make_general_version (function (a, b) return a+b end) 

print (general_add(4, 4, 4, 4)) 

असल में, आप हर एक समारोह के लिए एक नाम बना सकते हैं यदि आप चाहते हैं, लेकिन स्थितियों में जहां इतने सारे के आसपास फेंक रहे हैं एक-ऑफ फ़ंक्शंस, ऐसा करने के लिए अधिक सुविधाजनक नहीं है।

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