উত্তর:
লুয়া 5.2 এ গোটো ব্যবহার করা সবচেয়ে ভাল কাজ ar
-- prints odd numbers in [|1,10|]
for i=1,10 do
if i % 2 == 0 then goto continue end
print(i)
::continue::
end
এটি লুয়াজিআইটি-র সংস্করণ ২.০.১ থেকে সমর্থনযোগ্য
continue
একদিন অন্তর্ভুক্ত থাকবে । goto
প্রতিস্থাপন খুব সুন্দর চেহারা এবং আরো লাইন দরকার নেই। এছাড়াও, যদি আপনি দু'জনের সাথে একটি ফাংশনে একাধিক লুপ এটি করে থাকেন তবে কি সমস্যা সৃষ্টি করবে না ::continue::
? প্রতি লুপে নাম তৈরি করা কোনও শালীন জিনিস বলে মনে হয় না।
উপায় যে ভাষা আভিধানিক সুযোগ পরিচালনা করে উভয় সহ বিষয় সৃষ্টি goto
এবং continue
। উদাহরণ স্বরূপ,
local a=0
repeat
if f() then
a=1 --change outer a
end
local a=f() -- inner a
until a==0 -- test inner a
local a
লুপের দেহের অভ্যন্তরের ঘোষণাপত্রটির নাম বহিরাগত ভেরিয়েবলকে মুখোশ দেয় a
এবং সেই লোকালটির পরিধি until
বিবৃতিটির শর্ত জুড়ে প্রসারিত হয় সুতরাং শর্তটি অন্তঃস্থলটি পরীক্ষা করে a
।
যদি continue
বিদ্যমান থাকে তবে শর্তে ব্যবহৃত সমস্ত ভেরিয়েবলগুলি স্কোপে আসার পরে কেবল এটি বৈধ হওয়ার জন্য শব্দার্থিকভাবে সীমাবদ্ধ করতে হবে। এটি ব্যবহারকারীকে নথিভুক্ত করা এবং সংকলকটিতে প্রয়োগ করা একটি কঠিন শর্ত। এই সমস্যা এড়াতে বিভিন্ন প্রস্তাব নামঞ্জুর করার এর সহজ উত্তর সহ আলোচনা করা হয়েছে continue
সঙ্গে repeat ... until
লুপের শৈলী। এখনও অবধি, কারও কাছেই তাদের ভাষায় অন্তর্ভুক্ত করার জন্য যথেষ্ট পরিমাণে বাধ্যযোগ্য ব্যবহারের মামলা হয়নি had
চারপাশের কাজটি হ'ল সাধারণত যে অবস্থাটি continue
কার্যকর করা হয় সেই অবস্থাটি উল্টানো এবং সেই শর্তের আওতায় থাকা লুপের বাকী অংশটি সংগ্রহ করা। সুতরাং, নিম্নলিখিত লুপ
-- not valid Lua 5.1 (or 5.2)
for k,v in pairs(t) do
if isstring(k) then continue end
-- do something to t[k] when k is not a string
end
লেখা যেতে পারে
-- valid Lua 5.1 (or 5.2)
for k,v in pairs(t) do
if not isstring(k) then
-- do something to t[k] when k is not a string
end
end
এটি যথেষ্ট স্পষ্ট, এবং সাধারণত বোঝা নয় যতক্ষণ না আপনার কাছে লুপ ক্রিয়াকলাপকে নিয়ন্ত্রণ করে এমন কয়েকটি বিস্তৃত কুলগুলি রয়েছে।
until...
।
goto
লুয়া 5.2 তে প্রবেশের আগে লুয়া সম্প্রদায়ের মধ্যে এটি নিয়ে প্রচুর আলোচনা হয়েছিল । স্বাভাবিকভাবেই, goto
একই সমস্যা আছে। তারা শেষ পর্যন্ত সিদ্ধান্ত নিয়েছে যে রানটাইম এবং / অথবা কোড জেনারেশন এর ব্যয়টি যে পরিমাণেই রক্ষা goto
করতে পারে সেগুলি নমনীয় হওয়ার সুবিধার জন্য উপযুক্ত যা উভয় continue
এবং বহু-স্তরের অনুকরণ করতে ব্যবহার করা যেতে পারে break
। বিশদ পাওয়ার জন্য আপনাকে লুয়া তালিকা সংরক্ষণাগারটি অনুসন্ধান করতে হবে। যেহেতু তারা পরিচয় করিয়ে দিয়েছে goto
, স্পষ্টতই এটি দুর্গম নয়।
local
কেবল সংকলক-নির্দেশিকা - রানটাইম নির্দেশাবলী local
এবং ভেরিয়েবল ব্যবহারের মধ্যে কী তা গুরুত্বপূর্ণ নয় - একই স্কোপিং আচরণ বজায় রাখতে আপনাকে সংকলকটিতে কোনও পরিবর্তন করার দরকার নেই। হ্যাঁ, এটি এতটা সুস্পষ্ট নাও হতে পারে এবং কিছু অতিরিক্ত ডকুমেন্টেশন প্রয়োজন, তবে, আবারও বলার জন্য এটির সংকলকটিতে জিরো পরিবর্তন প্রয়োজন। repeat do break end until true
আমার উত্তর উদাহরণ ইতিমধ্যে উত্পন্ন ঠিক একই বাইটকোড কম্পাইলার অবিরত সঙ্গে দাঁড়ায় এই যে, মাত্র তফাত হল যে সাথে আছেন continue
এটি ব্যবহার করতে তুমি কুৎসিত অতিরিক্ত সিনট্যাক্স প্রয়োজন হত না।
do{int i=0;}while (i == 0);
ব্যর্থ হয়, বা সি ++ do int i=0;while (i==0);
তেও ব্যর্থ হয় ("এই সুযোগে ঘোষণা করা হয়নি")। দুর্ভাগ্যক্রমে লুয়ায় এখন এটি পরিবর্তন করতে খুব দেরি।
আপনি অতিরিক্তভাবে লুপের দেহটি মোড়ানো করতে পারেন repeat until true
এবং তারপরে do break end
চালিয়ে যাওয়ার প্রভাবের জন্য ভিতরে ব্যবহার করতে পারেন । স্বাভাবিকভাবেই, আপনি যদি অতিরিক্ত লুপটিও break
ঠিকঠাক করে ফেলতে চান তবে আপনাকে অতিরিক্ত পতাকা সেট আপ করতে হবে ।
এটি 5 বার লুপ করবে, প্রতিটি বার 1, 2 এবং 3 মুদ্রণ করবে।
for idx = 1, 5 do
repeat
print(1)
print(2)
print(3)
do break end -- goes to next iteration of for
print(4)
print(5)
until true
end
এই নির্মাণ এমনকি আক্ষরিক এক অপকোড অনুবাদ করে JMP
লুয়া বাইটকোডে !
$ luac -l continue.lua
main <continue.lua:0,0> (22 instructions, 88 bytes at 0x23c9530)
0+ params, 6 slots, 0 upvalues, 4 locals, 6 constants, 0 functions
1 [1] LOADK 0 -1 ; 1
2 [1] LOADK 1 -2 ; 3
3 [1] LOADK 2 -1 ; 1
4 [1] FORPREP 0 16 ; to 21
5 [3] GETGLOBAL 4 -3 ; print
6 [3] LOADK 5 -1 ; 1
7 [3] CALL 4 2 1
8 [4] GETGLOBAL 4 -3 ; print
9 [4] LOADK 5 -4 ; 2
10 [4] CALL 4 2 1
11 [5] GETGLOBAL 4 -3 ; print
12 [5] LOADK 5 -2 ; 3
13 [5] CALL 4 2 1
14 [6] JMP 6 ; to 21 -- Here it is! If you remove do break end from code, result will only differ by this single line.
15 [7] GETGLOBAL 4 -3 ; print
16 [7] LOADK 5 -5 ; 4
17 [7] CALL 4 2 1
18 [8] GETGLOBAL 4 -3 ; print
19 [8] LOADK 5 -6 ; 5
20 [8] CALL 4 2 1
21 [1] FORLOOP 0 -17 ; to 5
22 [10] RETURN 0 1
luac
এসওতে আউটপুট সরবরাহ করে দেখে ভাল লাগছে! একটি ভাল প্রাপ্য
"চালিয়ে যান" এর সাথে আমাদের মূল উদ্বেগটি হ'ল এখানে আরও কয়েকটি নিয়ন্ত্রণ কাঠামো রয়েছে যা (আমাদের দৃষ্টিতে) "চালিয়ে যান" এর চেয়ে কম বেশি গুরুত্বপূর্ণ এবং এমনকি এটি প্রতিস্থাপনও করতে পারে। (উদাহরণস্বরূপ, [জাভা হিসাবে] লেবেলগুলির সাথে বিরতি বা আরও জেনেরিক গোটো)) অন্যান্য নিয়ন্ত্রণ-কাঠামো ব্যবস্থার চেয়ে "চালিয়ে যাওয়া" বেশি বিশেষ বলে মনে হয় না, এটি আরও বেশি ভাষায় উপস্থিত রয়েছে। (পার্লের আসলে দুটি "চালিয়ে" স্টেটমেন্ট রয়েছে, "পরবর্তী" এবং "আবার করুন" উভয়ই কার্যকর))
continue
লুয়ায় রাখা ভুলে গেছি ।"
প্রথম ভাগে উত্তর প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী যেমন নিহত সরু বাইরে।
যেমন কাজের মতো, আপনি কোনও ফাংশনে লুপের বডিটি মোড়ানো করতে পারেন এবং return
এর থেকে প্রথম দিকে, উদাহরণস্বরূপ
-- Print the odd numbers from 1 to 99
for a = 1, 99 do
(function()
if a % 2 == 0 then
return
end
print(a)
end)()
end
অথবা যদি আপনি উভয় break
এবং continue
কার্যকারিতা চান তবে স্থানীয় ফাংশনটি পরীক্ষা করুন, যেমন
local a = 1
while (function()
if a > 99 then
return false; -- break
end
if a % 2 == 0 then
return true; -- continue
end
print(a)
return true; -- continue
end)() do
a = a + 1
end
collectgarbage("count")
আপনার সাধারণ 100 টি চেষ্টা করার পরেও যান এবং তারপরে আমরা কথা বলব। এই জাতীয় "অকাল" অপটিমাইজেশন গত সপ্তাহে প্রতি মিনিটে রিবুট করা থেকে একটি হাইলোডলোড প্রকল্পকে সংরক্ষণ করে।
আমি আগে কখনও লুয়া ব্যবহার করিনি, তবে আমি এটি গুগল করেছিলাম এবং এটি নিয়ে এসেছি:
পরীক্ষা করে দেখুন প্রশ্ন 1.26 ।
এটি একটি সাধারণ অভিযোগ। লুয়া লেখকরা অনুভব করেছিলেন যে চালিয়ে যাওয়া সম্ভাব্য নতুন নিয়ন্ত্রণ প্রবাহ প্রক্রিয়াগুলির মধ্যে একটি মাত্র ছিল (এটি সত্য যে এটি পুনরাবৃত্তির স্কোপ নিয়মগুলি নিয়ে কাজ করতে পারে না / যতক্ষণ না গৌণ বিষয় ছিল))
লুয়া 5.2-তে একটি গোটো স্টেটমেন্ট রয়েছে যা সহজে একই কাজটি করতে ব্যবহৃত হতে পারে।
আমরা অনেক সময় এই দৃশ্যের মুখোমুখি হয়েছি এবং চালিয়ে যাওয়ার অনুকরণে আমরা কেবল একটি পতাকা ব্যবহার করি। আমরা পাশাপাশি গোটো স্টেটমেন্টের ব্যবহার এড়াতে চেষ্টা করি।
উদাহরণ: কোডটি i = 3 ব্যতীত i = 1 থেকে i = 10 থেকে স্টেটমেন্টগুলি মুদ্রণ করতে চায়। এছাড়াও এটি আপনার কোডে থাকা অন্যান্য নেস্টেড স্টেটমেন্টগুলির অনুকরণের জন্য "লুপ স্টার্ট", লুপ এন্ড "," শুরু হলে ", এবং" যদি শেষ হয় "মুদ্রণ করে।
size = 10
for i=1, size do
print("loop start")
if whatever then
print("if start")
if (i == 3) then
print("i is 3")
--continue
end
print(j)
print("if end")
end
print("loop end")
end
পরীক্ষার পতাকা সহ লুপের শেষ সুযোগ পর্যন্ত সমস্ত অবশিষ্ট বিবৃতিগুলি সংযুক্ত করে অর্জিত হয়।
size = 10
for i=1, size do
print("loop start")
local continue = false; -- initialize flag at the start of the loop
if whatever then
print("if start")
if (i == 3) then
print("i is 3")
continue = true
end
if continue==false then -- test flag
print(j)
print("if end")
end
end
if (continue==false) then -- test flag
print("loop end")
end
end
আমি বলছি না যে এটি সেরা পদ্ধতির তবে এটি আমাদের পক্ষে নিখুঁতভাবে কাজ করে।
লুয়া হ'ল লাইটওয়েট স্ক্রিপ্টিং ল্যাঙ্গুয়েজ যা সম্ভব আরও ছোট করতে চায়। উদাহরণস্বরূপ, অনেক আনরি অপারেশন যেমন প্রাক / পোস্ট ইনক্রিমেন্ট পাওয়া যায় না
চালিয়ে যাওয়ার পরিবর্তে, আপনি গোটো লাইক ব্যবহার করতে পারেন
arr = {1,2,3,45,6,7,8}
for key,val in ipairs(arr) do
if val > 6 then
goto skip_to_next
end
# perform some calculation
::skip_to_next::
end
আবার বিবর্তনের সাথে, আপনি কেবল নীচের কোডটি ব্যবহার করতে পারেন:
for k,v in pairs(t) do
if not isstring(k) then
-- do something to t[k] when k is not a string
end
কারণ এটি অপ্রয়োজনীয় ¹ খুব কম পরিস্থিতি রয়েছে যেখানে কোনও দেবের প্রয়োজন হয়।
ক) যখন আপনার খুব সাধারণ লুপ থাকে তখন একটি 1- বা 2-লাইনার বলুন, তবে আপনি কেবল লুপের অবস্থাটি ঘুরিয়ে নিতে পারেন এবং এটি এখনও প্রচুর পরিমাণে পঠনযোগ্য।
খ) আপনি যখন সাধারণ পদ্ধতিগত কোডটি লিখছেন (যেমন, আমরা গত শতাব্দীতে কোডটি কীভাবে লিখেছি), আপনারও কাঠামোগত প্রোগ্রামিং প্রয়োগ করা উচিত (যেমন, আমরা কীভাবে গত শতাব্দীতে আরও ভাল কোড লিখেছি)
গ) আপনি যদি অবজেক্ট-ওরিয়েন্টেড কোড লিখছেন, তবে আপনার লুপের বডিটিতে এক বা দুটি লাইনারে প্রকাশিত না হওয়া অবধি এক বা দুটি মেথড কল থাকতে হবে না (যার ক্ষেত্রে এ দেখুন)
)) আপনি যদি কার্যকরী কোডটি লিখছেন তবে পরবর্তী পুনরাবৃত্তির জন্য কেবল একটি সাধারণ টেল-কলটি ফিরিয়ে দিন।
একমাত্র ক্ষেত্রে যখন আপনি একটি ব্যবহার করতে চান continue
কীওয়ার্ডটি যদি আপনি লুয়া কোডটি অজগরটির মতো কোড করতে চান তবে এটি কেবল এটি নয় ²
যদি না এ) প্রয়োগ না করা হয়, সেই ক্ষেত্রে কোনও কাজের ভিত্তির প্রয়োজন নেই, আপনার স্ট্রাকচার্ড, অবজেক্ট-ওরিয়েন্টড বা ফাংশনাল প্রোগ্রামিং করা উচিত। সেগুলি লুয়া যে দৃষ্টান্তগুলির জন্য নির্মিত হয়েছিল সেগুলি হল, তাই যদি আপনি তাদের বিন্যাসগুলি এড়াতে আপনার পথ থেকে দূরে সরে যান তবে আপনি ভাষার বিরুদ্ধে লড়াই করতে চাই ³
কিছু স্পষ্টতা:
Ua লুয়া একটি খুব সংক্ষিপ্ত ভাষা। এটি যতটা দূরে যেতে পারে তত কম বৈশিষ্ট্য রাখার চেষ্টা করে এবং কোনও continue
বিবৃতি সেই দিক থেকে প্রয়োজনীয় বৈশিষ্ট্য নয়।
আমি মনে করি সংক্ষিপ্ততার এই দর্শনটি 2019 সালের এই সাক্ষাত্কারে রবার্তো ইয়ারুসালিমস্কি দ্বারা ভালভাবে ধরা পড়েছে :
এটি এবং এটি এবং এটি যুক্ত করুন, এটি রেখে দিন এবং শেষ পর্যন্ত আমরা বুঝতে পারি চূড়ান্ত উপসংহারটি বেশিরভাগ লোককে সন্তুষ্ট করবে না এবং আমরা প্রত্যেকে যে পছন্দগুলি পছন্দ করব সেগুলি রাখব না, তাই আমরা কিছুই রাখি না। শেষ পর্যন্ত, কঠোর মোড একটি যুক্তিসঙ্গত আপস।
Ua লুয়ায় অন্যান্য ভাষা থেকে আগত প্রচুর প্রোগ্রামারদের প্রচুর পরিমাণ রয়েছে বলে মনে হয় কারণ তারা যে প্রোগ্রামের জন্য স্ক্রিপ্ট চেষ্টা করতে চেষ্টা করছে তা এটি ব্যবহার করার জন্য ঘটে এবং তাদের অনেকেই তাদের ভাষা ছাড়া অন্য কিছু লিখতে চায় না বলে মনে হয় পছন্দ, যা "লুয়ার এক্স বৈশিষ্ট্যটি কেন নেই?" এর মতো অনেক প্রশ্নের দিকে পরিচালিত করে?
ম্যাটজ সাম্প্রতিক এক সাক্ষাত্কারে রুবির সাথে একই রকম পরিস্থিতি বর্ণনা করেছেন :
সর্বাধিক জনপ্রিয় প্রশ্নটি হ'ল: "আমি ভাষা এক্স সম্প্রদায় থেকে এসেছি; আপনি কি এক্স ভাষা থেকে রুবি পর্যন্ত কোনও বৈশিষ্ট্য প্রবর্তন করতে পারবেন না?", বা এর মতো কিছু। এবং এই অনুরোধগুলির বিষয়ে আমার উত্তরটি হ'ল ... "না, আমি এটি করতাম না", কারণ আমাদের আলাদা ভাষার নকশা এবং ভিন্ন ভাষা বিকাশের নীতি রয়েছে।
Around এটিকে ঘিরে আপনার উপায় হ্যাক করার কয়েকটি উপায় রয়েছে; কিছু ব্যবহারকারী ব্যবহারের পরামর্শ দিয়েছেন goto
, যা বেশিরভাগ ক্ষেত্রে যথেষ্ট পরিমাণে অ্যাপ্রক্সিমেশন, তবে খুব কুরুচিপূর্ণ হয়ে যায় এবং নেস্টেড লুপগুলি দিয়ে সম্পূর্ণ ভেঙে যায়। goto
এস ব্যবহার করার ফলে আপনি যখনই অন্য কাউকে নিজের কোডটি দেখান এসআইসিপি-র একটি অনুলিপি আপনাকে ছুঁড়ে ফেলার আশঙ্কায় ফেলে দেয়।
continue
একটি সুবিধাজনক বৈশিষ্ট্য হতে পারে, কিন্তু এটি এটি প্রয়োজনীয় করে না । প্রচুর লোকেরা লুয়াকে একেবারে না করেই ব্যবহার করে, তাই এটি কোনও পরিষ্কার-পরিচ্ছন্ন বৈশিষ্ট্য ছাড়া আর কোনও কিছু নয় যা কোনও প্রোগ্রামিং ভাষার জন্য অপরিহার্য নয়।
goto
বিবৃতি পেয়েছিল যা ব্যবহার অবিরত করতে ব্যবহার করা যেতে পারে। নীচে উত্তর দেখুন।