এমন কোনও কারণ আছে যে সুইফ্ট অ্যারে অ্যাসাইনমেন্টটি বেমানান (কোনও রেফারেন্স বা গভীর কপি নয়)?


216

আমি ডকুমেন্টেশনটি পড়ছি এবং ভাষাটির কিছু ডিজাইনের সিদ্ধান্তে আমি ক্রমাগত মাথা নাড়ছি। তবে যে জিনিসটি আমাকে সত্যিই বিস্মিত করেছিল তা হ'ল অ্যারে কীভাবে পরিচালনা করা হয়।

আমি ছুটে গিয়ে খেলার মাঠে গিয়ে এগুলি চেষ্টা করে দেখলাম। আপনি এগুলিও চেষ্টা করে দেখতে পারেন। সুতরাং প্রথম উদাহরণ:

var a = [1, 2, 3]
var b = a
a[1] = 42
a
b

এখানে aএবং bউভয়ই [1, 42, 3]আমি গ্রহণ করতে পারি। অ্যারে রেফারেন্স করা হয় - ঠিক আছে!

এখন এই উদাহরণটি দেখুন:

var c = [1, 2, 3]
var d = c
c.append(42)
c
d

cহয় [1, 2, 3, 42]কিন্তু dহল [1, 2, 3]। এটিই, dসর্বশেষ উদাহরণে পরিবর্তনটি দেখেছেন তবে এটি এটিতে দেখেন না। ডকুমেন্টেশন বলে যে দৈর্ঘ্য পরিবর্তিত হয়েছে।

এখন, এটি সম্পর্কে কীভাবে:

var e = [1, 2, 3]
var f = e
e[0..2] = [4, 5]
e
f

eহয় [4, 5, 3], যা দুর্দান্ত। মাল্টি-ইনডেক্স রিপ্লেসমেন্টটি পাওয়া ভাল, তবে fদৈর্ঘ্য পরিবর্তন না হলেও এখনও পরিবর্তনটি দেখতে পাবে না।

সুতরাং এটি সংক্ষেপে, অ্যারের সাধারণ রেফারেন্সগুলি আপনি যদি 1 টি উপাদান পরিবর্তন করেন তবে পরিবর্তনগুলি দেখুন তবে আপনি যদি একাধিক উপাদান বা আইটেম সংযোজন করেন তবে একটি অনুলিপি তৈরি করা হবে।

এটি আমার কাছে খুব খারাপ ডিজাইনের মতো মনে হচ্ছে। আমি কি এই ভেবে ঠিক আছি? এমন কোনও কারণ আছে যা আমি দেখতে পাচ্ছি না কেন অ্যারেগুলিকে এ জাতীয় আচরণ করা উচিত?

সম্পাদনা : অ্যারে পরিবর্তন হয়েছে এবং এখন মূল্য শব্দার্থক আছে। আরও অনেক বুদ্ধিমান!


95
রেকর্ডের জন্য, আমি মনে করি না যে এই প্রশ্নটি বন্ধ করা উচিত। সুইফট একটি নতুন ভাষা, তাই আমরা সবাই যেমন শিখছি তখন কিছুক্ষণের জন্য এ জাতীয় প্রশ্ন থাকবে। আমি এই প্রশ্নটি খুব আকর্ষণীয় মনে করি এবং আমি আশা করি যে কেউ কারও প্রতিরক্ষা সম্পর্কে জোরালো মামলা করবে।
জোয়েল বার্গার

4
@ জোয়েল ফাইন, প্রোগ্রামারগুলিতে এটি জিজ্ঞাসা করুন, স্ট্যাক ওভারফ্লো নির্দিষ্ট অনির্ধারিত প্রোগ্রামিং সমস্যার জন্য।
bjb568

21
@ বিজেবি ৫68৮: যদিও এটি মতামত নয়। এই প্রশ্নটি সত্যের সাথে জবাবদিহি করা উচিত। যদি কিছু সুইফ্ট বিকাশকারী এসে জবাব দেয় যে "আমরা এক্স, ওয়াই এবং জেড এর জন্য এটি এরকম করেছিলাম", তবে এটি সরল সত্য। আপনি এক্স, ওয়াই এবং জেড এর সাথে একমত হতে পারেন না, তবে যদি এক্স, ওয়াই এবং জেডের জন্য কোনও সিদ্ধান্ত নেওয়া হয় তবে এটি ভাষার নকশার একটি factতিহাসিক সত্য। অনেকটা যখন আমি জিজ্ঞাসা করলাম কেন std::shared_ptrঅ-পারমাণবিক সংস্করণ নেই, তথ্যের ভিত্তিতে একটি উত্তর ছিল, মতামত নয় (সত্যটি এই যে কমিটি এটি বিবেচনা করেছিল কিন্তু বিভিন্ন কারণে এটি চায় নি)।
কর্নস্টালক

7
@ জেসনমারচার: কেবলমাত্র শেষ অনুচ্ছেদে মতামতের ভিত্তিতে তৈরি করা হয়েছে (যা হ্যাঁ, সম্ভবত অপসারণ করা উচিত)। প্রশ্নের আসল শিরোনাম (যা আমি আসল প্রশ্ন হিসাবে নিজেই গ্রহণ করি) তথ্যগুলির সাথে জবাবদিহি করে। সেখানে হয় একটি কারণ অ্যারে পথ তারা কাজ কাজ করতে ডিজাইন করা হয়েছে।
কর্নস্টালক

7
হ্যাঁ, এপিআই-বিস্ট যেমন বলেছে, একে সাধারণত "অনুলিপি-অর্ধ-অ্যাসিডড-ল্যাঙ্গুয়েজ-ডিজাইন" বলা হয়।
আর মার্টিনহো ফার্নান্দিস

উত্তর:


109

নোট করুন যে অ্যারে শব্দার্থবিজ্ঞান এবং বাক্য গঠনটি এক্সকোড বিটা 3 সংস্করণে ( ব্লগ পোস্ট ) পরিবর্তিত হয়েছিল , সুতরাং আর প্রশ্নটি প্রয়োগ হয় না। নিম্নলিখিত উত্তরটি বিটা 2 এ প্রয়োগ হয়েছে:


এটি কার্য সম্পাদনের কারণে reasons মূলত, তারা যতক্ষণ পারছে অ্যারে অনুলিপি করা এড়াতে চেষ্টা করে (এবং "সি-এর মতো পারফরম্যান্স" দাবি করে)। ভাষার বইয়ের উদ্ধৃতি দিতে :

অ্যারেগুলির জন্য, অনুলিপি কেবল তখনই ঘটে যখন আপনি কোনও ক্রিয়া সম্পাদন করেন যা অ্যারের দৈর্ঘ্য পরিবর্তন করার সম্ভাবনা রাখে। এর মধ্যে রয়েছে আইটেম সংযোজন, অন্তর্ভুক্ত করা বা অপসারণ, বা অ্যারেতে থাকা আইটেমগুলির একটি ব্যাপ্তি প্রতিস্থাপনের জন্য একটি রেঞ্জযুক্ত সাবস্ক্রিপ্ট ব্যবহার করা।

আমি সম্মত হই যে এটি কিছুটা বিভ্রান্তিকর, তবে কমপক্ষে এটি কীভাবে কাজ করে তার একটি স্পষ্ট এবং সরল বর্ণনা রয়েছে।

এই বিভাগে কোনও অ্যারে কীভাবে অনন্যভাবে রেফারেন্স করা হয়েছে তা নিশ্চিত করা যায়, কীভাবে অ্যারেগুলিকে জোর-অনুলিপি করা যায় এবং কীভাবে দুটি অ্যারে স্টোরেজ ভাগ করে দেয় কিনা তাও পরীক্ষা করে দেখুন information


61
আমি সত্যটি খুঁজে পেয়েছি যে আপনি উভয়ই ভাগ ভাগ করে নিচ্ছেন এবং ডিজাইনে একটি বড় লাল পতাকাটি অনুলিপি করুন।
চতুটু

9
এটা সঠিক। একজন প্রকৌশলী আমাকে বর্ণনা করেছেন যে ভাষা ডিজাইনের জন্য এটি আকাঙ্ক্ষিত নয়, এবং তারা সুইফটে আসন্ন আপডেটগুলিতে "ফিক্স" করার আশা করছেন to রাডার দিয়ে ভোট দিন।
এরিক কার্বার

2
এটি লিনাক্সের শিশু প্রসেস মেমরি ম্যানেজমেন্টে অনুলিপি (অনুলিপি) এর মতো কিছু, তাই না? সম্ভবত আমরা এটিকে অনুলিপি-পরিবর্তনের (সিওএলএ) বলতে পারি। আমি এটি একটি ইতিবাচক নকশা হিসাবে দেখছি।
justhalf

3
@ আসফাল্ফ আমি এসও-তে আসা এবং তাদের অ্যারেগুলি কেন ভাগ করা হয়নি / কেন জিজ্ঞাসা করা হয়েছে (কেবল একটি স্বল্প স্পষ্ট উপায়ে) বিভ্রান্ত হওয়া নবাগতদের একগুচ্ছ ভবিষ্যদ্বাণী করতে পারি।
জন ডিভোরাক

11
@ আসফাল্ফ: যেভাবেই হোক আধুনিক বিশ্বে COW হতাশাব্যঞ্জক, এবং দ্বিতীয়ত, COW একটি বাস্তবায়ন-কেবল প্রযুক্তি, এবং এই কোলা স্টাফগুলি সম্পূর্ণরূপে এলোমেলো শেয়ারিং এবং আনসার্শিংয়ের দিকে পরিচালিত করে।
পপি

25

সুইফট ভাষার সরকারী নথি থেকে :

নোট করুন যে সাবস্ক্রিপ্ট সিনট্যাক্সের সাথে আপনি যখন একটি নতুন মান সেট করেন তখন অ্যারে অনুলিপি করা হয় না, কারণ সাবস্ক্রিপ্ট সিনট্যাক্সের সাথে একক মান সেট করা অ্যারের দৈর্ঘ্য পরিবর্তন করার সম্ভাবনা রাখে না। তবে আপনি যদি অ্যারেতে কোনও নতুন আইটেম সংযোজন করেন তবে আপনি অ্যারের দৈর্ঘ্যটি সংশোধন করবেন । এটি সুইফ্টকে বিন্যাসে অ্যারেটির একটি নতুন অনুলিপি তৈরি করতে অনুরোধ জানায় যে আপনি নতুন মান যুক্ত করেন। এখন থেকে, একটি অ্যারের পৃথক, স্বতন্ত্র অনুলিপি .....

এই ডকুমেন্টেশনে অ্যারেগুলির জন্য সম্পূর্ণ বিভাগ অ্যাসাইনমেন্ট এবং অনুলিপি আচরণ পড়ুন । আপনি দেখতে পাবেন যে আপনি যখন অ্যারেতে আইটেমের একটি ব্যাপ্তি প্রতিস্থাপন করবেন তখন অ্যারে সমস্ত আইটেমের জন্য নিজের একটি অনুলিপি নেয়।


4
ধন্যবাদ। আমি আমার প্রশ্নের মধ্যে সেই লেখাটিকে অস্পষ্টভাবে উল্লেখ করেছি। তবে আমি একটি উদাহরণ দেখিয়েছি যেখানে সাবস্ক্রিপ্টের পরিসর পরিবর্তন করা দৈর্ঘ্য পরিবর্তন করে না এবং এটি এখনও অনুলিপি করে। সুতরাং আপনি যদি অনুলিপি না চান তবে আপনাকে একবারে এটির একটি উপাদান পরিবর্তন করতে হবে।
চতুটু

21

এক্সকোড 6 বিটা 3 এর সাথে আচরণটি পরিবর্তিত হয়েছে 3. অ্যারে আর রেফারেন্সের ধরণ নয় এবং একটি অনুলিপি-অন-লিখন পদ্ধতি রয়েছে, আপনি যখনই একটি বা অন্য ভেরিয়েবল থেকে অ্যারের সামগ্রী পরিবর্তন করবেন তখনই অ্যারের অনুলিপি করা হবে এবং কেবলমাত্র একটি অনুলিপি পরিবর্তন করা হবে।


পুরানো উত্তর:

অন্যরা যেমন উল্লেখ করেছে, একসাথে একক সূচকের জন্য মান পরিবর্তন করার সাথে সাথে সুইফট সম্ভব হলে অ্যারেগুলি অনুলিপি করার চেষ্টা করে ।

আপনি যদি নিশ্চিত হতে চান যে একটি অ্যারে ভেরিয়েবল (!) অনন্য, অর্থাত্ অন্য ভেরিয়েবলের সাথে ভাগ করা যায় না, আপনি unshareপদ্ধতিটি কল করতে পারেন । ইতিমধ্যে কেবলমাত্র একটি রেফারেন্স না থাকলে এটি অ্যারে অনুলিপি করে। অবশ্যই আপনি সেই copyপদ্ধতিটিও কল করতে পারেন , যা সর্বদা একটি অনুলিপি তৈরি করবে তবে অন্য কোনও ভেরিয়েবল একই অ্যারে ধরে রাখে না তা নিশ্চিত করার জন্য ভাগ ছাড়াই পছন্দ করা হয়।

var a = [1, 2, 3]
var b = a
b.unshare()
a[1] = 42
a               // [1, 42, 3]
b               // [1, 2, 3]

হুম, আমার জন্য, সেই unshare()পদ্ধতিটি সংজ্ঞায়িত।
হ্লুং

1
@ হ্লুং এটি বিটা 3-এ সরানো হয়েছে, আমি আমার উত্তর আপডেট করেছি।
পাস্কাল

12

আচরণটি Array.Resize। নেট এ পদ্ধতির সাথে চূড়ান্ত similar কী চলছে তা বোঝার জন্য, .সি, সি ++, জাভা, সি #, এবং সুইফটে টোকেনের ইতিহাসটি অনুসন্ধান করা সহায়ক হতে পারে ।

সি-তে কোনও কাঠামো ভেরিয়েবলের সমষ্টি ছাড়া আর কিছুই নয়। .স্ট্রাকচার টাইপের ভেরিয়েবল এ প্রয়োগ করলে স্ট্রাকচারের মধ্যে সঞ্চিত ভেরিয়েবল অ্যাক্সেস হবে। বস্তুগুলিতে পয়েন্টারগুলি ভেরিয়েবলগুলির সমষ্টি ধারণ করে না , তবে তাদের সনাক্ত করে। যদি কারও কাছে কোনও পয়েন্টার থাকে যা কোনও কাঠামো সনাক্ত করে, ->অপারেটরটি পয়েন্টার দ্বারা চিহ্নিত কাঠামোর মধ্যে সঞ্চিত ভেরিয়েবল অ্যাক্সেসের জন্য ব্যবহার করা যেতে পারে।

সি ++ তে স্ট্রাকচার এবং ক্লাসগুলি কেবলমাত্র সামগ্রিক চলকই নয়, তাদের সাথে কোডও সংযুক্ত করতে পারে। ব্যবহার .একটি পদ্ধতি ডাকা একটি পরিবর্তনশীল কাজ করার জন্য যে পদ্ধতি জিজ্ঞাসা করবে পরিবর্তনশীল নিজেই বিষয়বস্তু উপর ; ব্যবহার ->একটি পরিবর্তনশীল যা চিহ্নিত একটি বস্তু বস্তু উপর কাজ করতে যে পদ্ধতি জিজ্ঞাসা করবে উপর চিহ্নিত পরিবর্তনশীল দ্বারা।

জাভাতে, সমস্ত কাস্টম ভেরিয়েবল প্রকারভেদে অবজেক্টগুলি চিহ্নিত করে এবং একটি ভেরিয়েবলের উপর কোনও পদ্ধতি চাওয়া পদ্ধতিটি ভেরিয়েবল দ্বারা কোন বস্তুটি চিহ্নিত করা হবে তা পদ্ধতিটি বলবে। ভেরিয়েবলগুলি কোনও ধরণের যৌগিক ডেটা টাইপ সরাসরি ধরে রাখতে পারে না, বা কোনও উপায় নেই যার মাধ্যমে কোনও পদ্ধতি কোনও চলকটি অ্যাক্সেস করতে পারে যার সাহায্যে এটি চাওয়া হয়। এই বিধিনিষেধগুলি যদিও শব্দার্থগতভাবে সীমাবদ্ধ, রানটাইমটি ব্যাপকভাবে সরল করে, এবং বাইটকোড বৈধকরণকে সহজতর করে; এই জাতীয় সরলকরণ জাভাটির রিসোর্স ওভারহেডকে এমন সময়ে হ্রাস করেছিল যখন বাজার এ জাতীয় সমস্যাগুলির প্রতি সংবেদনশীল ছিল এবং এইভাবে এটি মার্কেটপ্লেসে ট্রেশন অর্জনে সহায়তা করেছিল। তারা আরও বোঝায় যে .সি বা সি ++ তে ব্যবহৃত সমতুল্য টোকেনের প্রয়োজন নেই । যদিও জাভা ->সি এবং সি ++ এর মতো ব্যবহার করতে পারত , স্রষ্টারা একক-অক্ষর ব্যবহার করতে পছন্দ করেছেন. যেহেতু এটি অন্য কোনও প্রয়োজনের জন্য প্রয়োজন ছিল না।

সি # এবং অন্যান্য। নেট ভাষায়, ভেরিয়েবলগুলি বস্তুগুলি সনাক্ত করতে পারে বা সরাসরি সংমিশ্রিত ডেটা ধরে রাখতে পারে। যখন একটি যৌগিক ডেটা টাইপের ভেরিয়েবল ব্যবহার করা হয় তখন ভেরিয়েবলের বিষয়বস্তু অনুসারে .কাজ করে ; রেফারেন্স প্রকারের পরিবর্তে যখন ব্যবহৃত হয়, চিহ্নিত বস্তুর উপরে কাজ করে.এটি দ্বারা. কিছু ধরণের ক্রিয়াকলাপের জন্য অর্থগত পার্থক্যটি বিশেষ গুরুত্বপূর্ণ নয়, তবে অন্যদের পক্ষে এটি। সর্বাধিক সমস্যাযুক্ত পরিস্থিতি হ'ল এমন একটি যৌগিক ডেটা টাইপের পদ্ধতি যা পরিবর্তিত পরিবর্তনের পরিবর্তে এটি পরিবর্তিত হয়, কেবলমাত্র পঠনযোগ্য ভেরিয়েবলের দিকে আহ্বান জানায়। যদি কেবল কোনও পঠনযোগ্য মান বা ভেরিয়েবলের জন্য কোনও পদ্ধতিটি আহ্বান করার চেষ্টা করা হয়, তবে সংকলকগণ সাধারণত চলকটি অনুলিপি করতে পারেন, পদ্ধতিটি তার উপর কাজ করতে দিন এবং ভেরিয়েবলটি বাতিল করুন। এটি সাধারণত এমন পদ্ধতিগুলির সাথে সুরক্ষিত যেগুলি কেবল পরিবর্তনশীল পড়তে পারে তবে এতে লেখা পদ্ধতিগুলির সাথে নিরাপদ নয়। দুর্ভাগ্যক্রমে, .ডোসগুলির কাছে এ জাতীয় প্রতিস্থাপনের সাথে কোন পদ্ধতিগুলি নিরাপদে ব্যবহার করা যেতে পারে এবং কোনটি পারে না তা বোঝানোর এখনও কোনও উপায় নেই।

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

যদি একটি টাইম মেশিন থাকে এবং সি # এবং / বা সুইফট তৈরিতে ফিরে যায়, ভাষা সি এবং+ ব্যবহারের আরও কাছাকাছি কোনও ফ্যাশনে ভাষা .এবং ->টোকেন ব্যবহার করে এই জাতীয় সমস্যার আশেপাশের বিভ্রান্তি অনেকটা এড়াতে পারে । সমষ্টি এবং রেফারেন্স উভয় পদ্ধতির পদ্ধতিতে তারা .যে ভেরিয়েবলটি আহ্বান করেছিল তার ->উপর কাজ করতে এবং কোনও মান (সংমিশ্রনের জন্য) বা এর দ্বারা চিহ্নিত জিনিস (রেফারেন্সের ধরণের জন্য) এর জন্য কাজ করতে পারে। কোনওটিই সেভাবে ডিজাইন করা হয়নি।

সি # তে, কোনও পদ্ধতির পরিবর্তিত পরিবর্তনের পরিবর্তনের জন্য যে পদ্ধতিতে এটি আহ্বান করা হয় তার সাধারণ অনুশীলন হ'ল ভ্যারিয়েবলটিকে একটি refপ্যারামিটার হিসাবে কোনও পদ্ধতিতে পাস করা । সুতরাং 20 টি উপাদানগুলির একটি অ্যারে চিহ্নিত করার Array.Resize(ref someArray, 23);সময় কল করলে মূল অ্যারেটিকে প্রভাবিত না করে 23 টি উপাদানের একটি নতুন অ্যারে সনাক্ত করা যায়। এর ব্যবহারটি পরিষ্কার করে দেয় যে পদ্ধতিটি যে ভেরিয়েবলটি প্রেরণ করা হয়েছিল তা পরিবর্তিত করার আশা করা উচিত। অনেক ক্ষেত্রে স্থির পদ্ধতি ব্যবহার না করে ভেরিয়েবলগুলি সংশোধন করতে সক্ষম হওয়াই সুবিধাজনক; সিন্ট্যাক্স ব্যবহার করে সুইফট ঠিকানাগুলির অর্থ । অসুবিধাটি হ'ল এটি ভেরিয়েবলগুলির উপর কোন পদ্ধতিগুলি কার্যকর হয় এবং কোন পদ্ধতিগুলি মূল্যবোধের ভিত্তিতে কাজ করে তা স্পষ্টতা হারায়।someArraysomeArrayref.


5

আমার কাছে এটি আরও বোধগম্য হয় যদি আপনি প্রথমে আপনার ধ্রুবকগুলিকে ভেরিয়েবলগুলির সাথে প্রতিস্থাপন করেন:

a[i] = 42            // (1)
e[i..j] = [4, 5]     // (2)

প্রথম লাইনটির আকার পরিবর্তন করার দরকার নেই a। বিশেষত, এটির জন্য কোনও মেমরি বরাদ্দ করার দরকার নেই। এর মান নির্বিশেষে, এটি iএকটি লাইটওয়েট অপারেশন। যদি আপনি কল্পনা করেন যে ফণা aনীচে একটি পয়েন্টার, এটি একটি ধ্রুবক পয়েন্টার হতে পারে।

দ্বিতীয় লাইনটি আরও জটিল হতে পারে। মান উপর নির্ভর করে iএবং j, আপনি মেমরি ব্যবস্থাপনা না করতে হতে পারে। যদি আপনি কল্পনা করেন যে eএটি একটি পয়েন্টার যা অ্যারের সামগ্রীগুলিকে নির্দেশ করে তবে আপনি আর ধরে নিতে পারবেন না যে এটি একটি ধ্রুবক পয়েন্টার; আপনাকে মেমরির একটি নতুন ব্লক বরাদ্দ করতে হবে, পুরানো মেমরি ব্লক থেকে নতুন মেমরি ব্লকে ডেটা অনুলিপি করতে হবে এবং পয়েন্টারটি পরিবর্তন করতে হবে।

দেখে মনে হচ্ছে ভাষা ডিজাইনাররা (1) যথাসম্ভব লাইটওয়েট রাখার চেষ্টা করেছেন। (২) যেভাবেই অনুলিপি করার সাথে জড়িত থাকতে পারে, তারা সেই সমাধানটির আশ্রয় নিয়েছে যা এটি সর্বদা এমনভাবে কাজ করে যে আপনি কোনও অনুলিপি করেছেন।

এটি জটিল, তবে আমি খুশি যে তারা এটিকে আরও জটিল করে নি যেমন উদাহরণস্বরূপ " বিশেষত কেসগুলির মধ্যে (যদি) i এবং j সংকলন-সময় ধ্রুবক এবং সংকলকটি অনুমান করতে পারে যে ই এর আকার যাচ্ছে না পরিবর্তন করতে, তারপর আমরা অনুলিপি করি না "


পরিশেষে, সুইফট ভাষার নকশা নীতিগুলি সম্পর্কে আমার বোঝার ভিত্তিতে, আমি মনে করি সাধারণ নিয়মগুলি এগুলি:

  • কনস্ট্যান্টস ( let) সর্বদা সর্বত্র ডিফল্টরূপে ব্যবহার করুন, এবং কোনও বড় বিস্ময় হবে না।
  • ভেরিয়েবলগুলি ( var) কেবলমাত্র যদি এটি সম্পূর্ণ প্রয়োজন হয় তা ব্যবহার করুন এবং সেই ক্ষেত্রে বিভিন্ন ক্ষেত্রে সাবধানতা অবলম্বন করুন, কারণ এতে আশ্চর্যের কিছু হবে [এখানে: কিছু পরিস্থিতিতে অ্যারেগুলির বিস্মৃত অন্তর্নিহিত অনুলিপিগুলি তবে সমস্ত পরিস্থিতিতে নয়]।

5

যা আমি পেয়েছি তা হ'ল: অ্যারেটি রেফারেন্সযুক্ত একটির মিউটেটেবল কপি হবে এবং কেবলমাত্র যদি অপারেশনটিতে অ্যারের দৈর্ঘ্য পরিবর্তন করার সম্ভাবনা থাকে । আপনার শেষ উদাহরণে, f[0..2]অনেকের সাথে সূচীকরণের মাধ্যমে, অপারেশনের দৈর্ঘ্য পরিবর্তনের সম্ভাবনা রয়েছে (এটি হতে পারে ডুপ্লিকেটগুলি অনুমোদিত নয়), তাই এটি অনুলিপি করা হচ্ছে।

var e = [1, 2, 3]
var f = e
e[0..2] = [4, 5]
e // 4,5,3
f // 1,2,3


var e1 = [1, 2, 3]
var f1 = e1

e1[0] = 4
e1[1] = 5

e1 //  - 4,5,3
f1 // - 4,5,3

8
"দৈর্ঘ্য পরিবর্তিত হয়েছে বলে বিবেচিত" "আমি বুঝতে পারি যে দৈর্ঘ্য পরিবর্তিত হলে এটি অনুলিপি করা হবে, তবে উপরের উদ্ধৃতিটির সাথে মিলিয়ে আমি মনে করি এটি সত্যিই উদ্বেগজনক" বৈশিষ্ট্য "এবং এটি আমার মনে হয় যে অনেক লোক ভুল হয়ে যাবে
জোয়েল বার্গার

25
কোনও ভাষা নতুন হওয়ার অর্থ এই নয় যে এটির অভ্যন্তরীণ দ্বন্দ্বগুলিকে সুস্পষ্ট করে রাখা ঠিক আছে।
অরবিট

এটি বিটা 3 এ "স্থির" করা হয়েছে, varঅ্যারেগুলি এখন পুরোপুরি পরিবর্তনযোগ্য এবং letঅ্যারেগুলি সম্পূর্ণ অপরিবর্তনীয়।
পাসক্যাল

4

ডেলফির স্ট্রিং এবং অ্যারেগুলির ঠিক একই "বৈশিষ্ট্য" ছিল। আপনি বাস্তবায়নের দিকে তাকালে, এটি বোধগম্য হয়েছিল।

প্রতিটি পরিবর্তনশীল গতিশীল মেমরির জন্য একটি পয়েন্টার হয়। সেই মেমরিটিতে অ্যারেতে থাকা ডেটা অনুসরণ করে একটি রেফারেন্স গণনা থাকে। সুতরাং আপনি সহজেই সম্পূর্ণ অ্যারে অনুলিপি বা কোনও পয়েন্টার পরিবর্তন না করে অ্যারেতে একটি মান পরিবর্তন করতে পারেন। আপনি যদি অ্যারের আকার পরিবর্তন করতে চান, আপনাকে আরও মেমরি বরাদ্দ করতে হবে। সেক্ষেত্রে বর্তমান পরিবর্তনশীল সদ্য বরাদ্দ হওয়া মেমরিটিকে নির্দেশ করবে। তবে আপনি সহজেই অন্যান্য ভেরিয়েবলগুলি অনুলিপি করতে পারবেন না যা মূল অ্যারেটির দিকে ইঙ্গিত করেছে, তাই আপনি সেগুলিকে একা রেখে যান।

অবশ্যই, আরও ধারাবাহিক বাস্তবায়ন করা কঠিন হবে না। আপনি যদি সমস্ত ভেরিয়েবলকে একটি আকার পরিবর্তন করতে চান, তবে এটি করুন: প্রতিটি পরিবর্তনশীল ডায়নামিক মেমোরিতে সংরক্ষিত ধারকটির পয়েন্টার। ধারকটি ঠিক দুটি জিনিস ধারণ করে, একটি রেফারেন্স গণনা এবং আসল অ্যারের ডেটারে পয়েন্টার। অ্যারের ডেটা গতিশীল মেমরির একটি পৃথক ব্লকে সংরক্ষণ করা হয়। অ্যারে ডেটাতে এখন কেবলমাত্র একটি পয়েন্টার রয়েছে, তাই আপনি সহজেই এটিকে পুনরায় আকার দিতে পারেন এবং সমস্ত ভেরিয়েবল পরিবর্তনটি দেখতে পাবেন।


4

প্রথমদিকে প্রচুর সুইফ্ট গ্রহণকারীরা এই ত্রুটি-প্রবণ অ্যারে শব্দার্থবিজ্ঞান সম্পর্কে অভিযোগ করেছেন এবং ক্রিস ল্যাটনার লিখেছেন যে অ্যারে শব্দার্থবিজ্ঞানগুলি সম্পূর্ণ মান সিমানটিকগুলি সরবরাহ করার জন্য সংশোধন করা হয়েছিল ( যাদের অ্যাকাউন্ট রয়েছে তাদের জন্য অ্যাপল বিকাশকারী লিঙ্ক )। এর সঠিক অর্থ কী তা জন্য আমাদের কমপক্ষে পরবর্তী বিটার জন্য অপেক্ষা করতে হবে।


1
নতুন অ্যারে আচরণটি এখন এসডিকে আইওএস 8 /
এক্সকোড


0

পরবর্তী সুইফট সংস্করণগুলিতে অ্যারে আচরণে কি কিছু পরিবর্তন হয়েছিল? আমি শুধু আপনার উদাহরণ চালান:

var a = [1, 2, 3]
var b = a
a[1] = 42
a
b

এবং আমার ফলাফলগুলি [1, 42, 3] এবং [1, 2, 3]

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.