Ptionচ্ছিক এবং নলেবল টাইপের মধ্যে পার্থক্য কী


15

সুইফট আছে Optionals। সি # এর Nullableপ্রকার রয়েছে।

যতদূর আমি উভয়কে একই উদ্দেশ্যে পরিবেশন করতে বলতে পারি, কিছু প্রকারের মান ছাড়াও তারা ভেরিয়েবলের মূল্য আছে কি না তা অপরিজ্ঞাত (অবিচ্ছিন্ন) তথ্য সংরক্ষণ করে।

প্রশ্নটি Optionalsকেবল Nullableবিভিন্ন নামের সাথে প্রকার বা অন্য ধারণাগত পার্থক্য রয়েছে?

অন্য কথায়, ধারণা সম্পর্কে নিজেই কথা বলছি, বা যে ভাষা নেই Optionalsবা আছে বা Nullablesসেগুলির পরিপ্রেক্ষিতে কোন শব্দটি ব্যবহৃত হয়েছে তা কী বিবেচনা করে?

যখন ভাষায় যে কার্যকারিতা বাস্তবায়নের এটা কোন ব্যাপার কিনা আমি নাম টাইপ Optionals<T>বাNullable<T>


একটি ভাষা অজ্ঞাবল দৃষ্টিকোণ থেকে, তারা অভিন্ন। এটি বলেছিল যে কোনও ভাষা ধারণার মধ্যে পার্থক্য করতে পারে (যেমন প্যাটার্ন মিলটি প্রয়োগ করা হয় কিনা)।
টমাস এডিং

সি # এর বিকল্পগুলিও থাকতে পারে (এটি কেবল একটি রীতিমতো নিদর্শন
ডেন

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

উত্তর:


5

তারা খুব একইভাবে কাজ করা সত্ত্বেও একটি আলাদা ধারণা রয়েছে। মাইক্রোসফ্ট ছাড়া সবাই (এখানে আই-রোল sertোকান) ব্যবহার করে nullএবং nullableকেবলমাত্র রেফারেন্সের প্রসঙ্গে। Optionsএবং Maybesসাধারণত রেফারেন্স এবং মান উভয়ই বোঝা যায়, বিশেষত ফাংশনাল প্রোগ্রামিং ভাষাগুলিতে যেখানে রেফারেন্সিয়াল স্বচ্ছতার অর্থ একটি মান এবং একটি রেফারেন্সের মধ্যে খুব বেশি পার্থক্য নেই।

অন্য কথায়, নিজেই ধারণা সম্পর্কে কথা বলছি, বা যে ভাষা নেই Optionalsবা আছে বা Nullablesসেগুলির পরিপ্রেক্ষিতে কোন শব্দটি ব্যবহৃত হয়েছে তা বিবেচনা করে?

Optionsএটি এমন একটি শব্দ যা বিস্তৃত দর্শকদের মধ্যে সর্বনিম্ন বিভ্রান্তির কারণ হয়। কেবলমাত্র সি # প্রোগ্রামাররা কোনও Nullableসম্ভাব্য মান মানের ক্ষেত্রে প্রয়োগ হিসাবে বিবেচনা করবে এবং আমি মনে করি তাদের বেশিরভাগই কমপক্ষে কোনওটি কী তা সম্পর্কে সচেতন Option


মাইক্রোসফ্ট এবং এসকিউএল ডিজাইনার ছাড়া সবাই, আমি মনে করি আপনি বোঝাতে চেয়েছেন।
জুলাই

9

.NET- এ দুটি ধরণের ধরণ রয়েছে: তথ্যসূত্র এবং মান (int, ডাবল, স্ট্রাক্ট, এনাম ইত্যাদি)। তাদের পার্থক্যের মধ্যে একটি বিষয় উল্লেখ করা যেতে পারে যে nullকোনও মান হতে পারে না। সুতরাং যদি আপনার কোনও মান প্রকার থাকে এবং "alচ্ছিক" বা "অজানা" শব্দার্থক বোঝাতে চান, আপনি এটি দিয়ে সজ্জিত করতে পারেন Nullable<>। নোট যা Nullable<>কেবলমাত্র মান ধরণের (এটির একটি where T : structধারা রয়েছে) গ্রহণ করতে টাইপ দ্বারা সীমাবদ্ধ । Nullable<>সংকলক থেকে এছাড়াও বিশেষ nullমূল্য আছে যার দ্বারা কোনও মান সুরক্ষিত থাকে NullReferenceExceptions:

string x = null;
x.ToString(); // throws a NullReferenceException

int? y = null;
y.ToString(); // returns ""

ক্রিয়ামূলক ভাষা (যেমন Scala, এফ #, Haskell,, সুইফট ইত্যাদি) জন্য আপনার অধিকার সাধারণ nullথেকে কোন অস্তিত্ব নেই । এটি কারণ সমগ্র মানুষ অস্তিত্বকে nullএকটি খারাপ ধারণা হিসাবে বিবেচনা করে এবং ভাষা ডিজাইনাররা এটিকে এড়িয়ে এই সমস্যাটি সমাধান করার সিদ্ধান্ত নিয়েছেন।

এর অর্থ হ'ল আবার এই ভাষাগুলিতে অমূল্য উপস্থাপনের জন্য আমাদের কিছু উপায় প্রয়োজন । Optionপ্রকারটি লিখুন (নামকরণ পরিবর্তিত হয়, এটি Maybeহাস্কেল নামে পরিচিত )। এটি একইরকম কাজ করে Nullableযে ক্ষেত্রে এটি "ধরণ" বা "অজানা" ইত্যাদি ক্ষেত্রে কেস যুক্ত করতে একটি প্রকারকে আবৃত করে

বাস্তব পার্থক্য হ'ল বাস্তবায়িত ভাষাগুলি দ্বারা আপনাকে দেওয়া অতিরিক্ত ফাংশনগুলিতে Option। উদাহরণ হিসাবে, নিন Option.map(সিউডোকোডে):

function Option<T2> Option.map(opt: Option<T1>, mapFunc: T1 -> T2) {
    if (opt is None) return None
    else return Option<T2>(mapFunc(opt.Value))
}

শৃঙ্খলাবদ্ধ ফাংশনগুলি Option.mapশৃঙ্খলাবদ্ধতা সি # এর যে কোনও জায়গায় আপনি দেখতে পাবেন এমন সাধারণ নাল চেক বয়লারপ্লেট এড়ানোর একটি শক্তিশালী উপায়:

if (service == null)
    return null;
var x = service.GetValue();
if (x == null || x.Property == null)
    return null;
return x.Property.Value;

সি # তে নূন্য সমতুল্য হ'ল:

public static Nullable<T2> Map<T1, T2>(this Nullable<T1> nullable, Func<T1, T2> f)
    where T1 : struct
    where T2 : struct
{
    if (!nullable.HasValue) return (T2?)null;
    else return (T2?) f(nullable.Value);
}

তবে এটি সি # তে সীমিত উপযোগিতা রয়েছে কারণ এটি কেবল মান ধরণের জন্যই কাজ করবে।

সি # এর নতুন সংস্করণটি "নাল প্রচার" অপারেটর ( ?.) সরবরাহ করে যা Option.mapকেবল পদ্ধতি এবং সম্পত্তি অ্যাক্সেসরের ক্ষেত্রে প্রযোজ্য ব্যতীত ফাংশনের অনুরূপ । উপরের নমুনা আবার লেখা হবে

return service?.GetValue()?.Property?.Value;

সি # একটি অপরিষ্কার কার্যকরী ভাষা (ঠিক F # হিসাবে)। এছাড়াও এফ # এর নাল রয়েছে।
ডেন

সি # 6 এর নাল মান জোর করে, তাই আপনার কমপক্ষে কিছু কোড আপ টু ডেট নয়: github.com/dotnet/roslyn/wiki/… roslyn.codeplex.com/discussion/540883
ডেন

এছাড়াও বিকল্পগুলি প্রয়োগ করা সহজ: github.com/louthy/language-ext
ডেন

1
@ ডেন: সি # ওওপির দিকে ঝুঁকছে যখন এফ # এফপির দিকে ঝুঁকছে। ডিফল্টরূপে কারীং অভাব এবং পরিবর্তনীয়তার অভাব সিরিয়াস ক্রিয়ামূলক প্রোগ্রামিংয়ের জন্য সি # উপযুক্ত নয়। আমি উত্তর শেষে নাল প্রচারের উল্লেখ করেছি। বিকল্পগুলি কার্যকরভাবে সি # তে বাস্তবায়নের পক্ষে সহজ তবে এটি প্রশ্ন থেকে দূরে রয়েছে।
অ্যালেক্সফক্সগিল 12

4
@ আমার মনে হয় আপনার মন্তব্যে শব্দগুলির কিছু দুর্বল পছন্দ আছে। একটি অশুচি কার্যকরী ভাষা একটি কার্যকরী ভাষা যা পার্শ্ব প্রতিক্রিয়াগুলিকে অনুমতি দেয়। সি # এর কিছু কার্যকরী বৈশিষ্ট্য থাকতে পারে এবং আপনি এগুলি দুর্দান্ত প্রভাব ফেলতে পারেন তবে এটি কার্যকরী ভাষা নয়। আমি অনুমান করেছি যে আপনি বোঝাতে চেয়েছিলেন যে ভাষা দুটিই 100% কার্যকরী নয়, তবে F # OCaml এর খুব কাছাকাছি যা বেশিরভাগ অ্যাকাউন্টগুলিতে একটি কার্যকরী ভাষা। এটি কার্যকরী দৃষ্টান্ত থেকে যা কিছু বিচ্যুতি ঘটে তা বেশিরভাগ ক্ষেত্রেই থাকে তাই এটি বিদেশী .NET কোডের সাথে ইন্টারঅ্যাক্ট করতে পারে। কেস পয়েন্টে, nullএফ # ধরণের বৈধ মান নয়।
ডোভাল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.