পার্থক্য . এবং: লুয়াতে


174

আমি .এবং মাধ্যমে ফাংশন কল মধ্যে পার্থক্য সম্পর্কে বিভ্রান্ত:

> x = {foo = function(a,b) return a end, bar = function(a,b) return b end, }
> return x.foo(3,4)
3
> return x.bar(3,4)
4
> return x:foo(3,4)
table: 0x10a120
> return x:bar(3,4)
3

কি :করছে?


1
সম্পর্কিত: stackoverflow.com/questions/3779671/...
finnw

উত্তর:


237

কোলন হ'ল পদ্ধতিগুলি প্রয়োগ করে যা selfপ্রথম প্যারামিটার হিসাবে পাস হয়। সুতরাং x:bar(3,4)হিসাবে একই হওয়া উচিত x.bar(x,3,4)


55
আহ ... সুতরাং এটি অবজেক্ট-ভিত্তিক সিনট্যাকটিক চিনি।
জেসন এস

7
যথাযথভাবে। পুরো রেফারেন্স ম্যানুয়ালটিতে, তারা এটিকে প্রদত্ত একমাত্র ঝাপসা হ'ল "কোলন সিনট্যাক্সগুলি পদ্ধতি নির্ধারণের জন্য ব্যবহৃত হয়, অর্থাত্ একটি কার্যকরী অতিরিক্ত প্যারামিটার স্বযুক্ত ফাংশনগুলি" " (5.0 ম্যানুয়াল, পিডিএফ পৃষ্ঠার নীচে 19)
বিএমইচ

2
ওহ আহ ... আমি জিজ্ঞাসা করতে যাচ্ছিলাম অফিসিয়াল ডক্সটি কোথায় ছিল, তবে আপনি আমাকে এতে মারধর করেছেন। সুন্দরভাবে সম্পন্ন. :-)
জেসন এস

1
@ কাইল এটি selfঅবজেক্টের উপর নির্ভর করে প্রথম প্যারামিটার এবং এর বৈশিষ্ট্যগুলির মান হিসাবে যাবে।
হাইড্রোপার

8
ভার্চুয়াল মেশিনটি একবারে পুনরুদ্ধার করায় @ কাইল কোলন সিনট্যাক্সটি একটু দ্রুত হবে you're মূলত ডট সিনট্যাক্সের মতো দু'বার object.method(object,args)পুনরুদ্ধার objectহয়, যখন কেবল একবারে object:method(arg)পুনরুদ্ধার হয় object। যদি objectকোনও গ্লোবাল, আপলিউ বা টেবিল ক্ষেত্র হয় তবে :তার চেয়ে দ্রুত ..এর চেয়ে দ্রুত আর কখনও হয় না :
নেগামার্টিন

28

সংজ্ঞা জন্য এটা ঠিক নিজে স্ব উল্লেখ হিসাবে একই - এটা এমনকি সংকলন একই বাইটকোড উত্পাদন করা হবে। অর্থাৎ function object:method(arg1, arg2)যেমন হয় function object.method(object, arg1, arg2)

ব্যবহারের :ক্ষেত্রে প্রায় একই রকম .- একটি বিশেষ ধরণের কল অভ্যন্তরীণভাবে নিশ্চিত হয়ে উঠবে objectএবং গণনা / অ্যাক্সেসের যে কোনও সম্ভাব্য পার্শ্ব প্রতিক্রিয়া কেবল একবার গণনা করা হবে। কলিং object:method(arg1, arg2)অন্যথায় হিসাবে একই object.method(object, arg1, arg2)


21

সম্পূর্ণরূপে সুনির্দিষ্ট হতে হবে, obj:method(1, 2, 3)হিসাবে একই

do
  local _obj = obj
  _obj.method(_obj, 1, 2, 3)
end

স্থানীয় পরিবর্তনশীল কেন? কারণ, অনেকে উল্লেখ করেছেন যে একবারে obj:method()কেবল সূচকগুলি _ENVপাওয়া যায় obj। গতি বিবেচনা করার সময় এটি সাধারণত গুরুত্বপূর্ণ তবে এই পরিস্থিতিটি বিবেচনা করুন:

local tab do
  local obj_local = { method = function(self, n) print n end }
  tab = setmetatable({}, {__index = function(idx)
    print "Accessing "..idx
    if idx=="obj" then return obj_local end
  end})
end
tab.obj.method(tab.obj, 20)
--> Accessing obj
--> Accessing obj
--> 20
tab.obj:method(10)
--> Accessing obj
--> 10

এখন কল্পনা করুন __indexরূপকটি কেবল কিছু ছাপানোর চেয়ে আরও বেশি কিছু করেছিল। কল্পনা করুন এটি কোনও কাউন্টার বাড়িয়েছে, কোনও ফাইলে কিছু লগ করেছে বা আপনার ডাটাবেস থেকে একটি এলোমেলো ব্যবহারকারীকে মুছে ফেলেছে। দু'বার বা শুধুমাত্র একবার করে করার মধ্যে একটি বড় পার্থক্য রয়েছে। এই ক্ষেত্রে, তার মাঝে একটি পরিষ্কার পার্থক্য obj.method(obj, etc)এবং obj:method(etc)


আপনার সত্যিকারের এই জাতীয় জিনিস নিয়ে চিন্তা করা উচিত নয়। যদি আপনার এটি করতে হয় তবে আপনার আর্কিটেকচারে কিছু মারাত্মক ভুল রয়েছে।
বলেছেন মনিকাকে

2
আমি বলতে পারি এটি অন্যদিকে; সম্পর্কযুক্ত কোডের প্রয়োগের বিশদ সম্পর্কে ভাল কোডের কোনও অনুমান করা উচিত নয়। ফাংশন কলগুলি স্মৃতিচারণ করতে পারে বা নাও হতে পারে, এর অর্থ এই নয় যে প্রয়োজনের চেয়ে প্রায়শই তাদের কল করা ভাল অনুশীলন।
ডার্কওয়াইপ্লেয়ার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.