2013-06-05 6 views
6

Lua 5.1 documentation for load() से:व्यवहार() जब हिस्सा फ़ंक्शन शून्य

भार एक हिस्सा समारोह func का उपयोग कर अपने टुकड़े को पाने के लिए। func पर प्रत्येक कॉल को एक स्ट्रिंग को वापस करना होगा जो पिछले परिणामों के साथ मिलकर बनता है। एक खाली स्ट्रिंग की वापसी, शून्य, या कोई मान खंड के अंत को संकेत नहीं देता है।

मेरे परीक्षण से, यह वास्तव में सच नहीं है। या, बल्कि, दस्तावेज न्यूनतम भ्रामक है।

इस उदाहरण स्क्रिप्ट पर विचार करें:

function make_loader(return_at) 
    local x = 0 

    return function() 
     x = x + 1 

     if x == return_at then return 'return true' end 

     return nil 
    end 
end 

x = 0 
repeat 
    x = x + 1 
until not load(make_loader(x))() 

print(x) 

उत्पादन उससे पहले load() देता है और कुछ भी नहीं फ़ंक्शन देता है nil लौटे समारोह make_loader() द्वारा वापस करने के लिए लगातार कॉल की संख्या है।

यदि आउटपुट फेस वैल्यू पर लिया जाना है तो आउटपुट यहां "1" होने की उम्मीद करेगा। हालांकि, आउटपुट "3" है। इसका तात्पर्य है कि load() पर तर्क nilload() छोड़ने से पहले तीन बार पर लौटाता है।

function make_loader() 
    local x = 0 

    return { 
     fn=function() 
      x = x + 1 

      if x == 1 then return 'return true' end 

      return nil 
     end, 
     get_x=function() return x end 
    } 
end 

loader = make_loader() 
load(loader.fn) 
print(loader.get_x()) 

यह प्रिंट "2" के रूप में मैं उम्मीद करेंगे:

दूसरी ओर, हिस्सा समारोह एक स्ट्रिंग तुरंत और फिर nil आगामी कॉल पर वापस लौट आता है, यह केवल एक nil लोड हो रहा है को रोकने के लिए ले जाता है।

तो मेरा सवाल है: क्या दस्तावेज़ीकरण गलत है? क्या यह व्यवहार किसी कारण से वांछनीय है? क्या यह load() में बस एक बग है?

+0

क्या आपने लुआ 5.2 की कोशिश की है? –

+0

@ निकोलबोलस संख्या – cdhowie

+2

आप इसे आजमा सकते हैं। यह शायद लुआ 5.1 में बस एक बग है। –

उत्तर

6

यह 5.1 में एक बग है। इसे 5.2 में सही किया गया है, लेकिन हम 5.1 में सुधार को शामिल करने में विफल रहे।

+0

एक फिक्स http://www.lua.org/bugs.html#5.1.5-2 पर पाया जा सकता है। – lhf

3

मैं तुम्हारा से थोड़ा अलग परिणाम प्राप्त (यह जानबूझकर प्रकट करने के लिए लगता है, लेकिन मैं किसी भी प्रलेखन इसके कारणों का स्पष्टीकरण नहीं मिल सकता है।), लेकिन वे अभी भी काफी नहीं क्या प्रलेखन का तात्पर्य हैं:

function make_loader(return_at) 
    local x = 0 
    return function() 
     x = x + 1 
     print("make_loader", return_at, x) 
     if x == return_at then return 'return true' end 
     return nil 
    end 
end 

for i = 1, 4 do 
    load(make_loader(i)) 
end 

यह रिटर्न निम्न परिणाम:

make_loader 1 1 
make_loader 1 2 
make_loader 2 1 
make_loader 2 2 
make_loader 2 3 
make_loader 3 1 
make_loader 3 2 
make_loader 4 1 
make_loader 4 2 

1 के लिए यह दो बार कहा जाता है क्योंकि पहले एक return true और दूसरा एक शून्य था। 2 के लिए इसे तीन बार कहा जाता है क्योंकि पहला वाला nil था, फिर return true, और फिर nil फिर से। अन्य सभी मूल्यों के लिए इसे दो बार कहा जाता है: ऐसा लगता है कि पहले nil को अनदेखा किया गया है और फ़ंक्शन को कम से कम एक बार कहा जाता है।

यदि वास्तव में यह मामला है, तो दस्तावेज़ को इसे प्रतिबिंबित करने की आवश्यकता है। मैंने सोर्स कोड को देखा, लेकिन कुछ भी नहीं देखा जो समझा सकता था कि पहले क्यों लौटाया गया nil अनदेखा किया गया है (मैंने खाली स्ट्रिंग के साथ भी परीक्षण किया है और उसी परिणाम के साथ कोई मूल्य नहीं है)।

+0

+1 अच्छी जानकारी। सुनिश्चित नहीं है कि यह तकनीकी रूप से एक उत्तर है और इसलिए मैं इसे इस तरह चिह्नित नहीं करूंगा, लेकिन अतिरिक्त जानकारी निश्चित रूप से उपयोगी है। – cdhowie

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