বিয়োগ চিহ্ন, '-' কেন সাধারণত প্লাস চিহ্নের মতো ওভারলোড হয় না?


64

প্লাস চিহ্নটি +সংযোজন এবং স্ট্রিং কনটেনটেশনের জন্য ব্যবহৃত হয় তবে এর সহযোগী: বিয়োগ চিহ্ন, -সাধারণত স্ট্রিংগুলি ছাঁটাই বা বিয়োগ বাদে অন্য কোনও ক্ষেত্রে দেখা যায় না। এর কারণ বা সীমাবদ্ধতা কী হতে পারে?

জাভাস্ক্রিপ্টে নিম্নলিখিত উদাহরণ বিবেচনা করুন:

var a = "abcdefg";
var b = "efg";

a-b == NaN
// but
a+b == "abcdefgefg"

35
কোন "yy" সরানো উচিত?
28:54

12
যদি আমি '+' চিহ্নের আচরণের সাথে চলে যাই তবে ডানটি সবচেয়ে বেশি বোঝায়।
দিগ্বিজয় যাদব

46
এটি যথেষ্ট খারাপ যে বাইনারি +অপারেটরটি দুটি সম্পূর্ণ অসম্পূর্ণ অর্থ "সংখ্যাসূচক সংযোজন" এবং "স্ট্রিং কনটেনটেশন" দিয়ে ওভারলোড হয়। সৌভাগ্যক্রমে, কিছু কিছু ভাষায় যেমন একটি পৃথক সংযুক্তকরণের অপারেটর প্রদান .(Perl5, পিএইচপি), ~(Perl6), &(ভিবি), ++(Haskell,), ...
আমন

6
@ ম্যাসনওহিলার তারা ব্যবহার করে ->( সিটিতে সদস্যের অ্যাক্সেসকে নির্ধারণ করার বিষয়টি বিবেচনা করুন, যেহেতু ভার্চুয়াল পদ্ধতি কলগুলি অগত্যা পয়েন্টার-এর মতো নির্দেশনা জড়িত)। ভাষা ডিজাইনের এমন কোনও আইন নেই যা .অপারেটর ব্যবহারের জন্য পদ্ধতি কল / সদস্য অ্যাক্সেসের প্রয়োজন , যদিও এটি ক্রমবর্ধমান সাধারণ সম্মেলন। আপনি কি জানেন যে স্মলটকের কোনও পদ্ধতি কল অপারেটর নেই? সরল সরু object methodঅবস্থান যথেষ্ট।
আমন

20
পাইথন সেট বিয়োগফলের জন্য ওভারলোড বিয়োগ করে (এবং এটি ব্যবহারকারী-সংজ্ঞায়িত ধরণের ক্ষেত্রেও ওভারলোড করা যেতে পারে)। পাইথন সেটগুলি মোড় / ইউনিয়ন / ইত্যাদির জন্য বেশিরভাগ বিটওয়াইড অপারেটরকে ওভারলোড করে।
কেভিন

উত্তর:


116

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

+অপারেটর সাধারণত একটি যুত অপারেশন উল্লেখ করে monoid , যে, একটি পরিচয় উপাদান সঙ্গে একটি মিশুক অপারেশন হল:

  • এ + (বি + সি) = (এ + বি) + সি
  • এ + 0 = 0 + এ = এ

পূর্ণসংখ্যা সংযোজন, স্ট্রিং কনটেনটেশন এবং ইউনিয়ন সেট করার মতো জিনিসের জন্য এই অপারেটরটি ব্যবহার করা বোধগম্য হয় কারণ তাদের সকলেরই বীজগণিত কাঠামো রয়েছে:

1 + (2 + 3) == (1 + 2) + 3
1 + 0 == 0 + 1 == 1

"a" + ("b" + "c") == ("a" + "b") + "c"
"a" + "" == "" + "a" == "a"

এবং আমরা এটি কোনও concatফাংশনটির মতো সহজ অ্যালগরিদম লিখতে ব্যবহার করতে পারি যা কোনও "যুক্তিযুক্ত" জিনিসগুলির অনুক্রমের উপর কাজ করে, যেমন:

def concat(sequence):
    return sequence.reduce(+, 0)

বিয়োগ -জড়িত হয়ে গেলে আপনি সাধারণত একটি গোষ্ঠীর কাঠামো সম্পর্কে কথা বলেন, যা প্রতিটি উপাদান A এর জন্য একটি বিপরীত −A যুক্ত করে, যাতে:

  • এ + −এ = −এ + এ = 0

এবং যদিও এটি পূর্ণসংখ্যার এবং ভাসমান-পয়েন্ট বিয়োগ বা এমনকি তাত্পর্য নির্ধারণের মতো জিনিসগুলির জন্য অর্থবোধ করে, তবুও স্ট্রিং এবং তালিকার পক্ষে এটি এতটা বোঝায় না। বিপরীতটি কি "foo"?

একটি বাতিলকরণ মনোয়েড নামে একটি কাঠামো রয়েছে , যার বিপরীতে নেই, তবে এটি বাতিলকরণের সম্পত্তি রয়েছে, যাতে:

  • এ - এ = 0
  • এ - 0 = এ
  • (এ + বি) - বি = এ

এটি এমন কাঠামো যা আপনি বর্ণনা করেছেন, কোথায় "ab" - "b" == "a", তবে "ab" - "c"সংজ্ঞায়িত হয়নি। এটি কেবলমাত্র আমাদের কাছে দরকারী কাঠামো ব্যবহার করে এমন অনেক দরকারী অ্যালগরিদম নেই। আমি অনুমান করি যদি আপনি সিরিয়ালাইজেশন হিসাবে কনটেক্সটেশনটিকে ভাবেন, তবে বিয়োগটি একধরণের পার্সিংয়ের জন্য ব্যবহার করা যেতে পারে।


2
সেটগুলির জন্য (এবং একাধিক-সেট) বিয়োগটি বোধগম্য হয়, কারণ অনুক্রমের বিপরীতে, উপাদানটির ক্রম কোনও বিষয় নয়।
কোডসইনচাউস

@ কোডসইন চাওস: আমি তাদের একটি উল্লেখ যুক্ত করেছি, তবে একটি গোষ্ঠীর উদাহরণ হিসাবে সেটগুলি স্থাপন করাতে আমি সত্যিই স্বাচ্ছন্দ্যবোধ করি না — আমি বিশ্বাস করি না যে সেগুলি একটি তৈরি করে, কারণ আপনি সাধারণত কোনও সেটটির বিপরীতটি নির্মাণ করতে পারবেন না।
জন পূর্ব

12
প্রকৃতপক্ষে, +অপারেশন সংখ্যার জন্যও পরিবর্তনশীল, অর্থাত্ A+B == B+Aএটি স্ট্রিং কনটেন্টেশনের জন্য খারাপ প্রার্থী করে। এটি, এবং আরও বিভ্রান্তিকর অপারেটর অগ্রাধিকার +স্ট্রিং কনটেন্টেশনের জন্য ব্যবহার করে একটি historicalতিহাসিক ভুল। তবে, এটি সত্য যে -স্ট্রিং অপারেশনের জন্য ব্যবহার করা বিষয়গুলিকে আরও খারাপ করে
তুলেছিল

2
@ দারখোগ: ঠিক! .পার্লের কাছ থেকে ধার করা পিএইচপি ; এটি ~পার্ল 6 এ, সম্ভবত অন্যরা।
জন পূর্ব

1
@ মার্টিনবেকেট তবে আপনি দেখতে পাচ্ছেন যে আচরণটি বিভ্রান্তিকর হতে পারে .text.gz.text...
বোরিস স্পাইডার

38

কারণ যে কোনও দুটি বৈধ স্ট্রিংয়ের সাথে যুক্ত হওয়া সর্বদা একটি বৈধ অপারেশন, তবে বিপরীতটি সত্য নয়।

var a = "Hello";
var b = "World";

a - bএখানে কি হওয়া উচিত ? এই প্রশ্নের উত্তর দেওয়ার সত্যিই ভাল উপায় নেই কারণ প্রশ্নটি নিজেই বৈধ নয়।


31
@ দিগ্বিজয় যাদব, আপনি যদি ৫ টি আপেল থেকে ৫ টি আম সরিয়ে ফেলেন তবে কি -৫ আমের পাল্টা থাকতে হবে? এটা কিছু করে না? আপনি কি এটিকে এত ভালভাবে সংজ্ঞায়িত করতে পারেন যে এই ফর্মটিতে এই অপারেটরটি ব্যবহার করার জন্য এটি বিস্তৃতভাবে গ্রহণযোগ্য এবং সমস্ত সংকলক এবং ভাষার অনুবাদককে রেখে দেওয়া যেতে পারে? এটাই এখানে বড় চ্যালেঞ্জ।
জেবি কিং

28
@ দিগ্বিজয় যাদব: সুতরাং আপনি এটিকে বাস্তবায়নের জন্য দুটি সম্ভাব্য উপায় বর্ণনা করেছেন এবং প্রত্যেককে বৈধ হিসাবে বিবেচনা করার জন্য একটি ভাল যুক্তি রয়েছে, সুতরাং আমরা ইতিমধ্যে এই ক্রিয়াকলাপটি নির্দিষ্ট করার ধারণার সাথে এক গণ্ডগোল সৃষ্টি করছি। : পি
ম্যাসন হুইলার

13
@ এসএমসি আমার কাছে মনে হচ্ছে 5 + Falseস্পষ্টতই একটি ত্রুটি হওয়া উচিত , যেহেতু একটি সংখ্যা বুলিয়ান নয় এবং বুলিয়ান একটি সংখ্যা নয়।
ম্যাসন হুইলারের

6
@ জানডভোরাক: এ সম্পর্কে বিশেষত "হাস্কেল্লি" তেমন কিছুই নেই; এটি মৌলিক শক্তিশালী টাইপিং।
ম্যাসন হুইলার

5
@ দিগ্বিজয় যাদব তাই (a+b)-b = a(আশা করি!) তবে (a-b)+bকখনও aকখনও কখনও কখনও তার a+bউপর নির্ভর করে bএকটি স্ট্রাস্টিং হয় aকি না? এ কী পাগলামি?

28

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

ফলস্বরূপ, পদ্ধতি কলগুলি অগ্রাধিকার দেওয়া হয়:

public string Remove(string source, string toRemove)
public string Replace(string source, string oldValue, string newValue)

সি # ভাষায়, আমরা +স্ট্রিং সংমিশ্রনের জন্য ব্যবহার করি কারণ ফর্ম

var result = string1 + string2 + string3;

পরিবর্তে

var result = string.Concat(string1, string2, string3);

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

+অপারেটর সত্যিই শুধুমাত্র এই প্রেক্ষাপটে এক জিনিস অর্থ করতে পারেন। এই জন্য সত্য নয় -যেহেতু বিয়োগ স্ট্রিং এর ধারণা দ্ব্যর্থক (ফাংশন কল করা হয়, Replace(source, oldValue, newValue)সঙ্গে ""যেমন newValueপরামিতি সব সন্দেহ দূর করে দেয়, এবং ফাংশন, সাবস্ট্রিং পরিবর্তন করতে, শুধু তাদের সরিয়ে ব্যবহার করা যেতে পারে)।

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

অপারেটর ওভারলোডগুলি রয়েছে যেগুলি +স্ট্রিং কনটেনটেশনের জন্য অপারেটরের চেয়ে ভাল শব্দার্থক সমন্বয় রয়েছে । এখানে দুটি জটিল সংখ্যা যুক্ত করার একটি এখানে রয়েছে:

public static Complex operator +(Complex c1, Complex c2) 
{
    return new Complex(c1.real + c2.real, c1.imaginary + c2.imaginary);
}

8
+1 দুটি স্ট্রিং দেওয়া হয়েছে, এ এবং বি, আমি AB কে "A এর শেষের দিক থেকে একটি বিছানা বি সরান," "এ এর কোথাও থেকে বি এর উদাহরণ সরিয়ে ফেলুন," "এ এর কোথাও থেকে বি এর সমস্ত দৃষ্টান্ত সরান" , "বা এমনকি" বি থেকে পাওয়া সমস্ত অক্ষর এ থেকে সরান "
আম্মনকে

8

খাঁজকাটা ভাষা অনুমতি দেয় -:

println('ABC'-'B')

আয়:

AC

এবং:

println( 'Hello' - 'World' )

আয়:

Hello

এবং:

println('ABABABABAB' - 'B')

আয়:

AABABABAB

11
আকর্ষণীয় - সুতরাং এটি প্রথম ঘটনাটি সরাতে পছন্দ করে? সম্পূর্ণ পাল্টা স্বজ্ঞাত আচরণের জন্য একটি ভাল উদাহরণ।
হাল্ক

9
সুতরাং, আমাদের ('ABABABABA' + 'B') - 'B'কাছে এটি আরম্ভের মানের সমান কাছে নেই 'ABABABABA'
একটি সিভিএন

3
@ মাইকেলKjörling OTOH, (A + B) - A == Bপ্রতি এ এবং বি এর জন্য , আমি কি তাকে বাম বিয়োগফল বলতে পারি?
জন ডিভোরাক

2
হাস্কেলকে ++জোর দেওয়া হয়েছে। এটি যে কোনও তালিকায় কাজ করে এবং একটি স্ট্রিং কেবলমাত্র অক্ষরের একটি তালিকা। \\এটিতে রয়েছে , যা বাম আর্গুমেন্ট থেকে ডান আর্গুমেন্টে প্রতিটি উপাদানের প্রথম উপস্থিতি সরিয়ে দেয়।
জন ডিভোরাক

3
আমি মনে করি এই উদাহরণগুলি হুবহু কেন স্ট্রিংয়ের জন্য কোনও বিয়োগ অপারেটর থাকা উচিত নয়। এটি বেমানান এবং স্বজ্ঞাত আচরণ নয়। আমি যখন "-" মনে করি তখন অবশ্যই আমি মনে করি না, "মিলিত স্ট্রিংয়ের প্রথম উদাহরণটি সরিয়ে ফেলুন, যদি এটি ঘটে, অন্যথায় কেবল কিছুই করবেন না।"
এন্ডারল্যান্ড

6

প্লাস চিহ্নটি সম্ভবত প্রাসঙ্গিকভাবে আরও কিছু ক্ষেত্রে অর্থবোধ করে তবে পাইথনে একটি পাল্টা উদাহরণ (সম্ভবত একটি ব্যতিক্রম যা নিয়ম প্রমাণ করে) হ'ল সেট অবজেক্ট, যা সরবরাহ করে -তবে তা নয় +:

>>> set('abc') - set('bcd')
set(['a'])
>>> set('abc') + set('bcd')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'set' and 'set'

+সাইনটি ব্যবহার করা বোধগম্য নয় কারণ উদ্দেশ্যটি দ্বিধাগ্রস্থ হতে পারে - এর অর্থ কি সেট সংযোগ বা মিলন? পরিবর্তে, এটি |ইউনিয়ন এবং &ছেদ করার জন্য ব্যবহার করে:

>>> set('abc') | set('bcd')
set(['a', 'c', 'b', 'd'])
>>> set('abc') & set('bcd')
set(['c', 'b'])

2
এটি সম্ভবত বেশি কারণ সেট বিয়োগটি গণিতে সংজ্ঞায়িত করা হয়েছে তবে সেট সংযোজন নয়।
মেহরদাদ

"-" এর ব্যবহারটি বিশ্রী মনে হচ্ছে; সত্যিকারের যা দরকার তা হ'ল "তবে নয়" অপারেটর যা পূর্ণসংখ্যার সাথে বিটওয়াইজ গাণিতিক সম্পাদন করার সময়ও দরকারী। যদি 30 ~ এবং 7 24 হয়, তবে sets & সেটগুলির সাথে & এবং | এর সাথে পুরোপুরি ফিট হবে fit যদিও সেটগুলিতে অপারেটরের অভাব রয়েছে।
সুপারক্যাট

1
set('abc') ^ set('bcd')প্রত্যাশা set(['a', 'd']), যদি আপনি প্রতিসম পার্থক্য সম্পর্কে জিজ্ঞাসা করছেন।
অ্যারন হল

3

" -" কিছু যৌগিক শব্দে ব্যবহৃত হয় (উদাহরণস্বরূপ, "সাইটে") একই শব্দে বিভিন্ন অংশে যোগ দেওয়ার জন্য। আমরা -প্রোগ্রামিং ভাষায় বিভিন্ন স্ট্রিংয়ের সাথে যুক্ত হওয়ার জন্য কেন " " ব্যবহার করি না ? আমি মনে করি এটি নিখুঁত জ্ঞান করতে হবে! এই +বোকা সাথে জাহান্নাম !

যাইহোক, আরও কিছু বিমূর্ত কোণ থেকে এটি দেখার চেষ্টা করা যাক।

আপনি স্ট্রিং বীজগণিত সংজ্ঞায়িত করবেন? আপনার কোন ক্রিয়াকলাপ হবে এবং তাদের জন্য কোন আইন থাকবে? তাদের সম্পর্ক কি হবে?

মনে রাখবেন, একেবারে অস্পষ্টতা থাকতে পারে না! প্রতিটি সম্ভাব্য কেসটি অবশ্যই ভালভাবে সংজ্ঞায়িত করা উচিত, এমনকি যদি এর অর্থ এটি করা সম্ভব হয় না তবে! আপনার বীজগণিত যত কম হবে এটি সহজে করা যায়।

উদাহরণস্বরূপ, দুটি স্ট্রিং যুক্ত বা বিয়োগ করার আসলে কী বোঝায়?

আপনি যদি দুটি স্ট্রিং যুক্ত করেন (উদাহরণস্বরূপ, আসুন a = "aa"এবং b = "bb"), আপনি কি aabbফলাফল হিসাবে পাবেন a + b?

কীভাবে b + a? তা হবে bbaa? কেন হবে না aabb? aaআপনার সংযোজনের ফলাফল থেকে বিয়োগ করলে কী হবে ? আপনার স্ট্রিং এর aaমধ্যে নেতিবাচক পরিমাণের একটি ধারণা আছে ?

এখন এই উত্তরটির শুরুতে ফিরে যান এবং spaceshuttleস্ট্রিংয়ের পরিবর্তে বিকল্প করুন। সাধারণকরণের জন্য, কোনও ক্রিয়াকলাপ কেন কোনও ধরণের সংজ্ঞায়িত বা সংজ্ঞায়িত হয় না?

আমি যে বিষয়টিটি তৈরির চেষ্টা করছি তা হ'ল, কোনও কিছুর জন্য বীজগণিত তৈরি করা থেকে বিরত কিছু নেই। অর্থবহ অপারেশনগুলি এমনকি এটির জন্য দরকারী অপারেশনগুলি খুঁজে পাওয়া শক্ত হতে পারে।

স্ট্রিংগুলির জন্য, কনটেনেটেটিং হ'ল একমাত্র বুদ্ধিমান যা আমি কখনও এসেছি। অপারেশনটির প্রতিনিধিত্ব করতে কোন প্রতীক ব্যবহৃত হয় তা বিবেচনা করে না।


1
"স্ট্রিংগুলির জন্য, কনটেনেটেটিং হ'ল একমাত্র বুদ্ধিমান যা আমি কখনও এসেছি" । তাহলে আপনি কি পাইথনের সাথে একমত নন 'xy' * 3 == 'xyxyxy'?
smci

3
@ এসএমসি যে কেবল গুণ-হিসাবে-পুনরাবৃত্তি-সংযোজন , অবশ্যই?
jonrsharpe

স্পেসশটল যুক্ত করতে উপযুক্ত অপারেটর কী?
মিঃ মাইন্ডার

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