লজিকাল অপারেটরগুলির জন্য কেন কোনও যৌগিক কার্যনির্বাহী অপারেটর নেই (যেমন ||, && ইত্যাদি)?


20

ECMA-262, অংশ 11,13 মতে, নিম্নলিখিত যৌগ নিয়োগ অপারেটরদের সম্পূর্ণ তালিকা হল: *= /= %= += -= <<= >>= >>>= &= ^= |=

অংশ 11.11 মতে, var c = a || bকরা হবে aমধ্যে মান cযদি ToBoolean(a)সত্য এবং করা হবে bমধ্যে মান cঅন্যথায়। যেমন, যৌক্তিক ওআর প্রায়শই কোলেসেস অপারেটর হিসাবে ব্যবহৃত হয়, যেমন

function (options) {
    options = options || {};
}

প্রায়শই যথেষ্ট, একসঙ্গে বেড়ে ওঠা পরিবর্তনশীল জন্য ডিফল্ট মান উল্লেখ করতে ব্যবহৃত হয় উপরের হিসাবে দেখানো হয়েছে: a = a || b

মনে হচ্ছে যে যৌগ নিয়োগ অপারেটর ||=সত্যিই দরকারী হবে, একটি সংক্ষিপ্ত এবং ক্লিনার ফ্যাশন উপরে কোড লিখতে সক্ষম হবেন: a ||= b। তবে এটি সেখানে নেই (যদিও *=, +=এবং অন্যান্য যৌগিক কার্যনির্বাহক অপারেটররা)।

প্রশ্ন হচ্ছে, কেন?


2
আমি অবিশ্বাস্যরূপে বিভ্রান্ত হয়েছি যে% = অপারেটর এমনকি উপস্থিত রয়েছে। কে প্রয়োজনীয় সিদ্ধান্ত নিয়েছে? এর মধ্যে কিছু অপারেটর খারাপ ভাষা নকশার সিদ্ধান্তগুলির মতো বলে মনে হয়।
জনাথন রিচ

2
@ জোনাথনরিচ: কেন% = নেই? আপনি যদি এই যে কোনও অ্যাসাইনমেন্ট অপারেটর পেতে চলেছেন তবে তাড়াতাড়ি বা পরে কিছু বিকাশকারী (যেমন প্যানারটুর) বিস্মিত হবে যে অপারেটররা কেন অন্যদের তুলনায় "আরও সমান"?
কেভিন ক্লিন

4
@ জোনাথানরিচ ক্রিপ্টো মডুলাসের উল্লেখযোগ্য ব্যবহার করে। Furthemore সেখানে গাণিতিক নিয়োগ অপারেটরে গাণিতিক বাকি সঙ্গে একটি পছন্দসই orthogonality আছে (যদি এক আশা +=, *=, -=, /=, কেন না would %=কাজ?)।

4
@ জোনাথানরিচ: আপনি যখন কিছু বিজ্ঞপ্তি পেয়ে থাকেন এবং এটিকে সাধারণীকরণ করতে চান, তখন অপারেটরটি কাজে আসে angle %= 360or উদাহরণস্বরূপ বা vertexIndex %= numberOfVertices(একটি বদ্ধ বহুভুজের শীর্ষস্থানীয় তালিকার জন্য)।
সেবাস্তিয়ান নেগ্রাসজাস

উত্তর:


12

একটি সম্ভাব্য কারণ হ'ল লজিকাল অপারেটরগুলির &&এবং ||"শর্ট সার্কিট" আচরণ রয়েছে। ডান প্রতীক &&এবং ||যদি না প্রয়োজনীয় মূল্যায়ন করা হয় না। সম্ভবত এই কারণে ভাষা ডিজাইনারগণ সিদ্ধান্ত নিয়েছিলেন যে মত প্রকাশের অর্থটি a ||= f()সুস্পষ্ট নয়, এবং এই জাতীয় অপারেটরগুলি আরও ভালভাবে বাদ যায়।


2
হ্যাঁ. উদাহরণস্বরূপ, অনেক লোক বিশ্বাস করে যে এর a ||= bব্যাখ্যা করা উচিত a = a || b, তবে বাস্তবে এটি a || a = b( রুবির মতো ) হতে পারে । সেটারের পার্শ্ব প্রতিক্রিয়া থাকলে সেগুলি পৃথক হতে পারে । অন্য শিবিরের ব্যবহারকারীদের জন্য একটি বেছে নেওয়া খারাপ হতে পারে। আমি ব্যক্তিগতভাবে a || a = bউপায়টি (রুবি উপায়) পছন্দ করি তবে সকলেই তাতে খুশি কিনা তা আমি নিশ্চিত নই।
ফ্র্যাঙ্কলিন ইউ

8

"এই ভাষার বৈশিষ্ট্যটি কেন প্রয়োগ করা হয়নি" সম্পর্কে সমস্ত প্রশ্নের সাধারণ উত্তর হ'ল যে ভাষাটি ডিজাইন করেছে সেই দলটি সিদ্ধান্ত নিয়েছে যে সুবিধাটি ব্যয়ের চেয়ে বেশি হবে না।

খরচ অনেক ফর্ম নিতে পারে। কোনও ভাষা বৈশিষ্ট্য বাস্তবায়নে সময় এবং প্রচেষ্টা প্রয়োজন, তবে জটিলতার স্বতন্ত্র ব্যয়ও রয়েছে: বৈশিষ্ট্যটি কি এর সম্ভাব্য সুবিধার অনুপাতে ভাষাটিকে আরও জটিল বা দ্বিধাগ্রস্ত করে তোলে?

অনুমানমূলক ||=অপারেটর অন্যান্য যৌগিক কার্যনির্বাহী অপারেটরগুলির থেকে মৌলিকভাবে আলাদা কিছু করে। অন্য অপারেটরগুলি নিখুঁতভাবে গাণিতিক প্রকৃতির হলেও এটি আলাদা: এটি অন্যটির জন্য একটি মানকে প্রতিস্থাপন করে (আপনি বর্ণিত প্রসঙ্গে)

এই অস্পষ্টতা দেওয়া (অপারেটর প্রসঙ্গে দুটি ভিন্ন ফাংশন সম্পাদন করে), কেন এটি ভাষাতে অন্তর্ভুক্ত করা হয়নি তা দেখা মুশকিল নয়। যদিও আপনি যে পরিবর্তনশীল

function (options) {
    options = options || {};
}

প্রতি

function (options) {
    options ||= {};
}

নাল কোলেসিং করা একটি মূল্যবান বৈশিষ্ট্য, বেনিফিটটি আমার কাছে কম স্পষ্ট। যদি মান প্রতিস্থাপন ঘটতে হয় তবে সমান চিহ্নের ডানদিকে উভয় মান থাকা যৌক্তিক (এবং আরও পরিষ্কার) মনে হয়, এই ধরনের প্রতিস্থাপন ঘটতে পারে এমন একটি ভিজ্যুয়াল ইঙ্গিত দেয়।

সি # একটি আলাদা পথ নিয়েছে এবং নাল কোলেসেসিংয়ের জন্য একটি নির্দিষ্ট অপারেটর ব্যবহার করে।


1
কোডটি পড়ার সময়, সেখানে প্রথম উদাহরণটি আরও প্রাকৃতিকভাবে পড়ে - দ্বিতীয় বিকল্পের তুলনায় "অপশন সমান বিকল্প বা কিছুই নয়" - "বিকল্পগুলি বা কিছুই সমান নয়"। আমি মনে করি এটি "বা সমান" অপারেটরকে অন্তর্ভুক্ত না করার জন্য এটি অন্য কারণ
অ্যানডি হান্ট

আপনার উত্তরের দুর্দান্ত উদ্বোধন। এবং আমি মনে করি আপনার উত্তরটির শুরুটি ট্যাগটির জন্য উইকির মধ্যে।

3
@ অ্যান্ডিবার্শ একই যুক্তিটি কোনও যৌগিক কার্যনির্বাহী অপারেটরের ক্ষেত্রে প্রয়োগ করা যেতে পারে। "এক্স সমান এক্স গুণ 2 সমান 2" "এক্স বার সমান 2" এর তুলনায় আরও প্রাকৃতিকভাবে পড়া হয়।
পেনরতুর

2
নোট করুন যে টাইপিংয়ের foo = foo || barজন্য আপনার fooদু'বার টাইপ করতে হবে । এটি উভয়ই জটিল এবং রিপ্যাক্টরিং টাইপগুলিও প্রবণ।
ফোগজ

1
আমি মনে করি আপনি "গাণিতিক" এর অর্থ ভুল বুঝেছেন, সম্ভবত আপনি বুলিয়ান বীজগণিত সম্পর্কে শুনেছেন। ||=নাল কোলেসিং অপারেটর হিসাবে ব্যবহার করার জন্য আমি একটি নন-বুলিয়ানকে জোর দেওয়া সম্মত, এবং আসলে কোড-ফর্মের মধ্যে আবদ্ধ মনে হচ্ছে। আপনি যখন বুলিয়ান গণিত করার চেষ্টা করছেন তখন এটি কার্যকর হয়ে যায়। function fulfill(inValue) { if(resolved || rejected) return false; /* Do stuff here */ return true; } resolved ||= fulfill(value)
joshperry

3

আপনি ঠিক যে ||=এটি একটি দরকারী নির্মাণ। এটি পার্লে বিদ্যমান।

আসলে পার্ল এগুলি সমস্ত উপলব্ধ করে তোলে :

**=    +=    *=    &=    <<=    &&=   -=    /=    
|=     >>=   ||=   .=    %=     ^=    //=   x=

এর মধ্যে কিছু দুর্দান্ত ( .=স্ট্রিংয়ের শেষে কিছু যুক্ত করে), অন্যরাও কম ( &&=??? আমার ধারণা ভেরিয়েবলটি এবং ভেরিয়েবল উভয়ই সত্য হলে ডানদিকে সেট হয়ে যায় But তবে আপনি কেন কখনও এটি করবেন? ?)

কোন ভাষায় যা অন্তর্ভুক্ত রয়েছে তা হ'ল এটির নকশা দর্শনের একটি বৈশিষ্ট্য।


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