কোনও ভাষার কি অলারি বুলেট টগল অপারেটর রয়েছে?


141

সুতরাং এটি একটি তাত্ত্বিক প্রশ্ন বেশি। সি ++ এবং ভাষাগুলি (এর মধ্যে) সরাসরি এটির উপর ভিত্তি করে (জাভা, সি #, পিএইচপি) প্রথম অপারেন্ডে বেশিরভাগ বাইনারি অপারেটরগুলির ফলাফল নির্ধারণের জন্য শর্টকাট অপারেটর রয়েছে , যেমন

a += 3;   // for a = a + 3
a *= 3;   // for a = a * 3;
a <<= 3;  // for a = a << 3;

তবে যখন আমি বুলিয়ান এক্সপ্রেশনটি টগল করতে চাই তখন আমি সর্বদা নিজেকে এমন কিছু লিখতে দেখি

a = !a;

aএকটি দীর্ঘ অভিব্যক্তি মত যখন বিরক্তিকর হয়ে ওঠে।

this.dataSource.trackedObject.currentValue.booleanFlag =
    !this.dataSource.trackedObject.currentValue.booleanFlag;

(হ্যাঁ, ডেমিটারের আইন, আমি জানি)।

তাই আমি ভাবছিলাম, এমন কি কোনও ভাষা আছে যা ইউনারি বুলিয়ান টগল অপারেটরের সাথে আমাকে a = !aএক্সপ্রেশনটি পুনরাবৃত্তি না করে সংক্ষেপণ করতে দেয় a, উদাহরণস্বরূপ

!=a;  
// or
a!!;

আসুন ধরে নেওয়া যাক আমাদের ভাষার একটি যথাযথ বুলিয়ান টাইপ রয়েছে (যেমন boolসি ++ তে) এবং এটি aসেই ধরণের (সুতরাং কোনও সি-স্টাইল নয় int a = TRUE)।

আপনি যদি কোনও নথিভুক্ত উত্সটি খুঁজে পেতে পারেন তবে আমি জানতে আগ্রহী যে যেমন সি ++ ডিজাইনাররা boolকোনও বিল্ট-ইন টাইপের হয়ে ওঠার পরে সেইরকম অপারেটর যুক্ত করার বিষয়টি বিবেচনা করেছেন এবং যদি তাই হয় তবে তারা কেন এটির বিরুদ্ধে সিদ্ধান্ত নিয়েছিল।


(দ্রষ্টব্য: আমি জানি যে কিছু লোক মতামত হল যে নিয়োগ ব্যবহার করা উচিত নয় হয় =এবং যে ++এবং +=দরকারী অপারেটার কিন্তু নকশা সংক্রান্ত ত্রুটিগুলি নয়; এলইটি শুধু অনুমান আমি কেন তারা bools প্রসারিত করবে না তাদের এবং ফোকাস নিয়ে খুশি নই)।


31
একটি ফাংশন সম্পর্কে কী void Flip(bool& Flag) { Flag=!Flag; }আপনার দীর্ঘ অভিব্যক্তি সংক্ষিপ্ত করে।
হার্পার

72
this.dataSource.trackedObject.currentValue.booleanFlag ^= 1;
কামিলকুক

13
কোডটি সহজ করার জন্য দীর্ঘ অভিব্যক্তিগুলি রেফারেন্সগুলিতে বরাদ্দ করা যেতে পারে
কোয়ান্টিন 2

6
@ কামিলকুক এটি কার্যকর হতে পারে তবে আপনি মিক্সআপের ধরণগুলি পারেন। আপনি একটি বোল একটি পূর্ণসংখ্যার নিয়োগ।
হার্পার

7
@ ব্যবহারকারী 463035818 *= -1যদিও রয়েছে, যা কোনও কারণে আমি এর চেয়ে বেশি স্বজ্ঞাত বলে মনে করি ^= true
কম্পিশিপ

উত্তর:


15

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

টিএল; ডিআর দৃশ্যত না, তবে সুইফ্ট আপনাকে একটি প্রয়োগ করতে দেয়। আপনি কীভাবে এটি সম্পন্ন হয়েছে তা দেখতে চাইলে আপনি এই উত্তরের নীচে স্ক্রোল করতে পারেন।


বিভিন্ন ভাষার বৈশিষ্ট্যগুলির (দ্রুত) অনুসন্ধানের পরে, আমি এই কথাটি বলতে নিরাপদ বোধ করি যে কোনও ভাষা এই অপারেটরটিকে স্থান পরিবর্তন করার জন্য কঠোর পরিবর্তন হিসাবে প্রয়োগ করে নি (যদি আপনি কোনওটি খুঁজে পান তবে আমাকে সংশোধন করুন)। সুতরাং পরের জিনিসটি দেখতে কোনও ভাষা আছে যা আপনাকে একটি তৈরি করতে দেয়। এর জন্য দুটি জিনিস যা প্রয়োজন তা হ'ল:

  1. ফাংশন সহ অপারেটরগুলি (অ্যানারি) প্রয়োগ করতে সক্ষম হওয়া
  2. ফাংশনগুলিকে পাস-রেফারেন্স আর্গুমেন্ট দেওয়ার অনুমতি দেয় (যাতে তারা তাদের যুক্তিগুলি সরাসরি রূপান্তর করতে পারে)

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


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

prefix operator ^

prefix func ^ (b: inout Bool) {
    b = !b
}

var foo = true
print(foo)
// true

^foo

print(foo)
// false

6
ভাষা এটি সরবরাহ করবে: github.com/apple/swift-evolution/blob/master/proposals/…
ক্রিশ্চিক

3
হ্যাঁ, তবে প্রশ্নটি বিশেষ করে কোনও অপারেটরের জন্য বলেছিল , সদস্যের কাজ নয়।
লরি পাইসপেনেন


3
@ বুয়েথিয়াস ধন্যবাদ! মরিচা জন্য সম্পাদিত - কেবলমাত্র কাস্টম প্রকারের জন্য ওভারলোডেড অপারেটরদের অনুমতি দেয়, সুতরাং কোনও ডাইস নেই no
লরি পাইসপেনেন

3
@ লৌরিপিস্পেনেন এই নিয়মটি তার থেকে বেশি সাধারণ, এবং এতিম নিয়মের কারণে , এফওয়াইআই
বোয়েথিয়াস

143

বুলিয়ান বিট টগল করছে

... এটি আমাকে এর জন্য a = !a এক্সপ্রেশনটি পুনরাবৃত্তি না করেa সংক্ষেপে অনুমতি দেবে ...

এই পদ্ধতির প্রকৃতপক্ষে কোনও খাঁটি "পরিবর্তনকারী ফ্লিপ" অপারেটর নয়, তবে উপরে আপনার মানদণ্ডগুলি পূরণ করে; অভিব্যক্তির ডান হাতটি ভেরিয়েবলের সাথে জড়িত নয়।

বুলিয়ান এক্সওর অ্যাসাইনমেন্ট সহ যে কোনও ভাষা (উদাহরণস্বরূপ ^=) কোনও ভেরিয়েবলের বর্তমান মানকে উল্টানোর অনুমতি দেবে, বলুন a, এক্সওর অ্যাসাইনমেন্টের মাধ্যমে true:

// type of a is bool
a ^= true;  // if a was false, it is now true,
            // if a was true, it is now false

নীচের মন্তব্য @cmaster দ্বারা সরু আউট হিসাবে, উপরে অনুমান aধরনের হয় bool, এবং একটি পূর্ণসংখ্যা বা পয়েন্টার যেমন নয়। যদি aপ্রকৃতপক্ষে অন্য কিছু হয় (উদাহরণস্বরূপ কিছু bool"সত্যবাদী" বা "মিথ্যা" মানকে মূল্যায়ন না করে কিছুটা উপস্থাপনা যা যথাক্রমে হয় না 0b1বা 0b0, যথাক্রমে হয় না ) তবে উপরের অংশটি ধারণ করে না।

একটি দৃ concrete় উদাহরণের জন্য, জাভা এমন একটি ভাষা যেখানে এটি সুনির্দিষ্টভাবে সংজ্ঞায়িত এবং কোনও নীরব রূপান্তরগুলির বিষয় নয়। নীচে থেকে @ বোয়ান এর মন্তব্য উদ্ধৃত:

জাভা সালে ^এবং ^=স্পষ্টভাবে Booleans এবং পূর্ণসংখ্যার জন্য আচরণ সংজ্ঞায়িত করেছে ( 15.22.2। বুলিয়ান লজিক্যাল অপারেটর &, ^এবং| ), যেখানে পারেন অপারেটর উভয় পক্ষের Booleans হতে হবে, বা উভয় পক্ষের পূর্ণসংখ্যার হতে হবে। এই ধরণের মধ্যে কোনও নীরব রূপান্তর নেই। সুতরাং এটি aএকটি পূর্ণসংখ্যা হিসাবে ঘোষণা করা হয় নিঃশব্দে malpunction যাচ্ছে না , বরং, একটি সংকলন ত্রুটি দিন। তাই a ^= true;জাভাতে নিরাপদ এবং সংজ্ঞায়িত।


সুইফট: toggle()

সুইফট ৪.২ অনুসারে, নিম্নলিখিত বিবর্তন প্রস্তাব গৃহীত হয়েছে এবং প্রয়োগ করা হয়েছে:

এটি সুইফটে টাইপের সাথে একটি নেটিভ toggle()ফাংশন যুক্ত করে Bool

toggle()

বুলিয়ান ভেরিয়েবলের মান টগল করে।

ঘোষণা

mutating func toggle()

আলোচনা

থেকে একটি বুলিয়ান মান টগল করার জন্য এই পদ্ধতি ব্যবহার করুন trueথেকে falseবা থেকে falseথেকে true

var bools = [true, false]

bools[0].toggle() // bools == [false, false]

এটি প্রতি অপারেটর নয়, বুলিয়ান টগলিংয়ের জন্য কোনও ভাষা নেটিভ পদ্ধতির অনুমতি দেয় allow


3
মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
স্যামুয়েল লিউ

44

সি ++ এ অপারেটরদের অর্থকে নতুন করে সংজ্ঞায়িত করার জন্য কার্ডিনাল পাপ করা সম্ভব। এটিকে মনে রেখে এবং কিছুটা ADL রেখে আমাদের ব্যবহারকারীর বেসে মেহেম ছাড়তে আমাদের যা করতে হবে তা হ'ল:

#include <iostream>

namespace notstd
{
    // define a flag type
    struct invert_flag {    };

    // make it available in all translation units at zero cost
    static constexpr auto invert = invert_flag{};

    // for any T, (T << invert) ~= (T = !T)    
    template<class T>
    constexpr T& operator<<(T& x, invert_flag)
    {
        x = !x;
        return x;
    }
}

int main()
{
    // unleash Hell
    using notstd::invert;

    int a = 6;
    std::cout << a << std::endl;

    // let confusion reign amongst our hapless maintainers    
    a << invert;
    std::cout << a << std::endl;

    a << invert;
    std::cout << a << std::endl;

    auto b = false;
    std::cout << b << std::endl;

    b << invert;
    std::cout << b << std::endl;
}

প্রত্যাশিত আউটপুট:

6
0
1
0
1

9
"অপারেটরদের অর্থকে নতুন করে সংজ্ঞায়িত করার জন্য কার্ডিনাল সিন" - আমি পেয়েছি যে আপনি অতিরঞ্জিত হয়েছিলেন তবে বিদ্যমান অপারেটরগুলিকে সাধারণভাবে নতুন অর্থ বোঝাতে এটি সত্যিকারের পাপ নয়
কনরাড রুডল্ফ

5
@ কনরাডরুডল্ফ অবশ্যই এর অর্থ আমি কী বোঝাতে চাইছি যে কোনও অপারেটরের উচিত তার স্বাভাবিক গাণিতিক বা যৌক্তিক অর্থের সাথে যুক্তিযুক্ত বোধ তৈরি করা। 2 টি স্ট্রিংয়ের জন্য 'অপারেটর + log যুক্তিসঙ্গত, যেহেতু সংমিশ্রণ যোগ বা জমা হওয়ার মতো (আমাদের মনের চোখে) সমান। operator<<এসটিএলে এটির আসল অপব্যবহারের কারণে 'স্ট্রিম আউট' হওয়ার অর্থ এসেছে। এর অর্থ স্বাভাবিকভাবেই হবে না যে 'আরএইচএসে রূপান্তর ফাংশনটি প্রয়োগ করুন', যা মূলত আমি এখানে এটিকে পুনর্নিযুক্ত করেছি।
রিচার্ড হেজস

6
আমি মনে করি না যে এটি একটি ভাল যুক্তি, দুঃখিত। প্রথমত, স্ট্রিং কনটেনটেশনের সংযোজন থেকে সম্পূর্ণ পৃথক শব্দার্থক শব্দ রয়েছে (এটি এমনকি চলাফেরারও নয়!)। দ্বিতীয়ত, আপনার যুক্তি দ্বারা <<কিছুটা শিফট অপারেটর, কোনও "স্ট্রিম আউট" অপারেটর নয়। আপনার পুনঃনির্ধারণের সমস্যাটি এটি অপারেটরের বিদ্যমান অর্থগুলির সাথে সঙ্গতিপূর্ণ নয়, বরং এটি একটি সাধারণ ফাংশন কলের চেয়ে কোনও মূল্য যুক্ত করে না।
কনরাড রুডল্ফ

8
<<খারাপ ওভারলোডের মতো মনে হচ্ছে। আমি করতাম !invert= x;;)
ইয়াক্ক - অ্যাডাম নেভ্রামামন্ট

12
@ ইয়াক্ক-অ্যাডামনেভ্র্যামন্ট এলএল, এখন আপনি আমাকে শুরু করেছেন: Godbolt.org/z/KIkesp
রিচার্ড হজস

37

যতক্ষণ না আমরা সমাবেশের ভাষা অন্তর্ভুক্ত করি ...

বের

INVERT কিছুটা পরিপূরক জন্য

0= একটি যৌক্তিক (সত্য / মিথ্যা) পরিপূরক জন্য।


4
তর্কযোগ্য, প্রতিটি স্ট্যাক-ভিত্তিক ভাষায় একটি অ্যানারি notহ'ল "টগল" অপারেটর :-)
বার্গি

2
অবশ্যই, এটি ওপাশের সামান্য উত্তরের একটি কারণ হ'ল ওপি স্পষ্টভাবে সি-জাতীয় ভাষাগুলি সম্পর্কে চিন্তাভাবনা করছে যা একটি traditionalতিহ্যগত অ্যাসাইনমেন্ট বিবৃতি রয়েছে। আমি মনে করি এর মতো পাশের উত্তরগুলির মান রয়েছে, যদি কেবল প্রোগ্রামিং জগতের কোনও অংশটি দেখানো হয় যা পাঠক হয়তো ভাবেননি। ("স্বর্গ ও পৃথিবীতে আরও অনেক প্রোগ্রামিং ল্যাঙ্গুয়েজ রয়েছে, হোরেটিও, আমাদের দর্শনে যে স্বপ্নের চেয়ে ভাল তা নয়" ")
ওয়েন কনরাড

31

Decrementing একটি C99 boolবৃদ্ধিশীল বা decrementing হবে আকাঙ্ক্ষিত প্রভাব ফেলবে হিসাবে, bitকিছু ক্ষুদ্র- মাইক্রোকন্ট্রোলার উপভাষা সমর্থিত (ধরনের যা থেকে আমি পর্যবেক্ষিত আচরণ বিট কি করেছি একক বিট প্রশস্ত bitfields, তাই সব এমনকি সংখ্যার 0 এবং সব থেকে কেটে বিজোড় সংখ্যা 1)। আমি বিশেষত এ জাতীয় ব্যবহারের পরামর্শ দেব না, কারণ আমি boolশব্দার্থবিজ্ঞানের প্রকারের বড় ফ্যান নই [আইএমএইচও, এই ধরণেরটি উল্লেখ করা উচিত ছিল যে bool0 বা 1 ব্যতীত অন্য কোনও মান সঞ্চিত রয়েছে এমনটি পড়ার সময় আচরণ করতে পারে এটিতে একটি অনির্ধারিত (প্রয়োজনীয় ধারাবাহিক নয়) পূর্ণসংখ্যা মান রয়েছে; যদি কোনও প্রোগ্রাম 0 বা 1 হিসাবে পরিচিত না এমন একটি পূর্ণসংখ্যা মান সঞ্চয় করার চেষ্টা !!করছে তবে প্রথমে এটি ব্যবহার করা উচিত ]।


2
সি ++ bool সি ++ 17 অবধি একই কাজ করেছিল ।
ডেভিস হেরিং

31

2
আমি মনে করি না এটি একে অপরের মনে যা ছিল, এটি ধরে নেওয়া এটি x86 এর সমাবেশ। যেমন en.wikibooks.org/wiki/X86_As आशीर्वाद ; here edx would be 0xFFFFFFFE because a bitwise NOT 0x00000001 = 0xFFFFFFFE
বার্নসবিএ

8
পরিবর্তে আপনি সমস্ত বিট ব্যবহার করতে পারেন: 0x00000000 = 0xFFFFFFFF নয়
অ্যাড্রিয়ান

5
ঠিক আছে, হ্যাঁ, যদিও আমি বুলিয়ান এবং বিটওয়াইজ অপারেটরগুলির মধ্যে পার্থক্য আঁকার চেষ্টা করছিলাম। ওপ যেমন প্রশ্নে বলেছেন, অনুমান করুন ভাষার একটি সুসংজ্ঞায়িত বুলিয়ান টাইপ রয়েছে: "(সুতরাং কোনও সি-স্টাইলের ইনট = সত্য নয়)"
বার্নসবিএ

5
@ বার্নসবিএ: প্রকৃতপক্ষে, অ্যাসেম্বলি ভাষাগুলিতে সুসংজ্ঞায়িত সত্যবাদী / মিথ্যা মানগুলির একটিও সেট নেই। কোড-গল্ফের ওপরে, বিভিন্ন ভাষায় বুলিয়ান সমস্যার জন্য আপনাকে কোন মানগুলি ফেরত দেওয়ার অনুমতি দেওয়া হয়েছে তা নিয়ে অনেক আলোচনা করা হয়েছে। যেহেতু asm এর কোন if(x)নির্মাণ নেই , তাই 0 / -1 কে মিথ্যা / সত্য হিসাবে অনুমোদন দেওয়া সম্পূর্ণ যুক্তিসঙ্গত, যেমন সিমডির তুলনা ( felixcloutier.com/x86/PCMPEQB:PCMPEQW:PCMPEQD.html )। তবে আপনি ঠিক বলেছেন যে আপনি যদি এটি অন্য কোনও মূল্যে ব্যবহার করেন তবে এটি ব্রেক হয়।
পিটার কর্ডেস

4
একক বুলিয়ান প্রতিনিধিত্ব পাওয়া শক্ত যে PCMPEQW এর ফলাফল 0 / -1 এ আসে তবে SETcc এর ফলাফল 0 / + 1 এ আসে।
ইউজিন স্টায়ার

28

আমি ধরে নিচ্ছি যে আপনি কেবলমাত্র এর উপর ভিত্তি করে কোনও ভাষা বেছে নেবেন না :-) যে কোনও ক্ষেত্রে আপনি সি ++ তে এই জাতীয় কিছু দিয়ে করতে পারেন:

inline void makenot(bool &b) { b = !b; }

উদাহরণস্বরূপ নিম্নলিখিত সম্পূর্ণ প্রোগ্রামটি দেখুন:

#include <iostream>

inline void makenot(bool &b) { b = !b; }

inline void outBool(bool b) { std::cout << (b ? "true" : "false") << '\n'; }

int main() {
    bool this_dataSource_trackedObject_currentValue_booleanFlag = false;
    outBool(this_dataSource_trackedObject_currentValue_booleanFlag);

    makenot(this_dataSource_trackedObject_currentValue_booleanFlag);
    outBool(this_dataSource_trackedObject_currentValue_booleanFlag);

    makenot(this_dataSource_trackedObject_currentValue_booleanFlag);
    outBool(this_dataSource_trackedObject_currentValue_booleanFlag);
}

প্রত্যাশা অনুযায়ী এই ফলাফলগুলি:

false
true
false

2
আপনি কি চান return b = !b? কেউ পড়ছেন foo = makenot(x) || yবা কেবল সাধারণ foo = makenot(bar), makenotএটি খাঁটি ফাংশন বলে ধরে নিতে পারে এবং ধরে নিতে পারে কোনও পার্শ্ব-প্রতিক্রিয়া নেই। একটি বৃহত্তর এক্সপ্রেশন ভিতরে একটি পার্শ্ব প্রতিক্রিয়া কবর সম্ভবত খারাপ শৈলী, এবং একটি অ-শূন্য রিটার্ন টাইপ একমাত্র সুবিধা যে সক্ষম করা হয়।
পিটার কর্ডেস 21'18

2
@ মাত্তিও ইটালিয়া পরামর্শ দেয় template<typename T> T& invert(T& t) { t = !t; return t; } , যা প্ররোচিত হচ্ছে তা boolকোনও অ- boolঅবজেক্টে ব্যবহার করা হলে / থেকে রূপান্তর করবে । IDK যদি তা ভাল হয় বা খারাপ। সম্ভবত ভাল।
পিটার কর্ডেস

22

পোস্টস্ক্রিপ্ট , ফোর্বের মতো একটি কনটেস্টেটিভ , স্ট্যাক-ওরিয়েন্টেড ভাষা হওয়ায় একটি অবিচ্ছিন্ন টগল আছে, নেইনা অপারেটর স্ট্যাকের উপর মান টগল করে। উদাহরণ স্বরূপ,

true    % push true onto the stack
not     % invert the top of stack
        % the top of stack is now false

দেখুন পোস্টস্ক্রিপ্ট ভাষা রেফারেন্স ম্যানুয়াল (PDF) , পি। 458।


21

ভিজ্যুয়াল বেসিক. নেট এটি একটি এক্সটেনশন পদ্ধতির মাধ্যমে সমর্থন করে।

এক্সটেনশন পদ্ধতিটি এর মতো সংজ্ঞায়িত করুন:

<Extension>
Public Sub Flip(ByRef someBool As Boolean)
    someBool = Not someBool
End Sub

এবং তারপরে এটিকে কল করুন:

Dim someVariable As Boolean
someVariable = True
someVariable.Flip

সুতরাং, আপনার আসল উদাহরণটি দেখতে এমন কিছু লাগবে:

me.DataSource.TrackedObject.CurrentValue.BooleanFlag.Flip

2
শর্টহ্যান্ড লেখক যেভাবে এটি চেয়েছিলেন এটি কাজ করার সময় অবশ্যই প্রয়োগ করতে আপনাকে অবশ্যই দুটি অপারেটর ব্যবহার করতে হবে Flip(): =এবং Not। এটি শিখতে আকর্ষণীয় যে SomeInstance.SomeBoolean.Flipএটি কল করার ক্ষেত্রেও SomeBooleanসম্পত্তি হিসাবে কাজ করে, যদিও সমতুল্য সি # কোডটি সংকলন করে না।
বেকন

14

মরিচে, বৈশিষ্ট্যগুলি কার্যকর করে এমন প্রকারগুলি প্রসারিত করতে আপনি নিজের নিজস্ব বৈশিষ্ট্য তৈরি করতে পারেন Not:

use std::ops::Not;
use std::mem::replace;

trait Flip {
    fn flip(&mut self);
}

impl<T> Flip for T
where
    T: Not<Output = T> + Default,
{
    fn flip(&mut self) {
        *self = replace(self, Default::default()).not();
    }
}

#[test]
fn it_works() {
    let mut b = true;
    b.flip();

    assert_eq!(b, false);
}

আপনি ^= trueপ্রস্তাবিত হিসাবেও ব্যবহার করতে পারেন এবং মরচেদের ক্ষেত্রে এটি করার কোনও সম্ভাব্য সমস্যা নেই কারণ falseসি বা সি ++ এর মতো কোনও "ছদ্মবেশী" পূর্ণসংখ্যা নয়:

fn main() {
    let mut b = true;
    b ^= true;
    assert_eq!(b, false);

    let mut b = false;
    b ^= true;
    assert_eq!(b, true);
}


3

সি # তে :

boolean.variable.down.here ^= true;

বুলিয়ান ^ অপারেটরটি এক্সওআর, এবং সত্যের সাথে এক্সওরিংটি ইনভার্টিংয়ের সমান।

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