C ++ สืบทอดตัวดำเนินการสีน้ำเงินที่แท้จริงจาก C โดยที่ฉันหมายความว่า "+" ใน 6 + 4 นั้นพิเศษมาก เช่นคุณไม่สามารถรับตัวชี้ไปยังฟังก์ชัน +
สกาล่าในอีกด้านหนึ่งไม่มีตัวดำเนินการในทางนั้น มันมีความยืดหยุ่นอย่างมากในการกำหนดชื่อเมธอดและบิตที่มีมาก่อนสำหรับสัญลักษณ์ที่ไม่ใช่คำ ดังนั้นทางเทคนิคสกาล่าไม่ได้มีผู้ประกอบการมากไป
สิ่งที่คุณต้องการเรียกมันว่าการบรรทุกเกินพิกัดไม่ได้เลวร้ายอย่างแท้จริงแม้แต่ใน C ++ ปัญหาคือเมื่อโปรแกรมเมอร์ไม่ดีใช้งานในทางที่ผิด แต่ตามความจริงแล้วฉันเห็นว่าการกำจัดความสามารถของโปรแกรมเมอร์ในการละเมิดผู้ปฏิบัติงานมากเกินไปไม่ได้ทำให้การแก้ไขทุกสิ่งที่โปรแกรมเมอร์สามารถทำได้ คำตอบที่แท้จริงคือการให้คำปรึกษา http://james-iry.blogspot.com/2009/03/operator-overloading-ad-absurdum.html
ไม่มีความแตกต่างระหว่างตัวดำเนินการโอเวอร์โหลดของ C ++ กับวิธีการตั้งชื่อแบบยืดหยุ่นของ Scala ซึ่ง IMHO ทำให้ Scala มีทั้งที่ใช้งานไม่ได้และใช้งานได้มากกว่า
ใน C ++ วิธีเดียวที่จะได้รับเครื่องหมายการแก้ไขคือการใช้ตัวดำเนินการ มิฉะนั้นคุณต้องใช้ object.message (อาร์กิวเมนต์) หรือตัวชี้ -> messsage (อาร์กิวเมนต์) หรือฟังก์ชั่น (argument1, argument2) ดังนั้นหากคุณต้องการสไตล์ DSLish บางอย่างกับรหัสของคุณแล้วมีความกดดันในการใช้โอเปอเรเตอร์
ใน Scala คุณสามารถรับสัญกรณ์ผูกกับข้อความใด ๆ ที่ส่ง "อาร์กิวเมนต์ข้อความวัตถุ" นั้นใช้ได้อย่างสมบูรณ์แบบซึ่งหมายความว่าคุณไม่จำเป็นต้องใช้สัญลักษณ์ที่ไม่ใช่คำเพื่อให้ได้สัญลักษณ์
การบรรทุกเกินพิกัดของตัวดำเนินการ C ++ นั้น จำกัด อยู่ที่ตัวดำเนินการ C เป็นหลัก เมื่อรวมกับข้อ จำกัด ที่ผู้ให้บริการเท่านั้นที่อาจใช้มัดที่สร้างแรงกดดันให้ผู้คนพยายามที่จะทำแผนที่หลากหลายแนวคิดที่ไม่เกี่ยวข้องกับสัญลักษณ์ที่ค่อนข้างน้อยเช่น "+" และ ">>"
Scala อนุญาตให้มีสัญลักษณ์ที่ไม่ใช่คำที่ถูกต้องเป็นชื่อวิธี ตัวอย่างเช่นฉันมี DSL Prolog-ish ในตัวที่คุณสามารถเขียนได้
female('jane)! // jane is female
parent('jane,'john)! // jane is john's parent
parent('jane, 'wendy)! // jane is wendy's parent
mother('Mother, 'Child) :- parent('Mother, 'Child) & female('Mother) //'// a mother of a child is the child's parent and is female
mother('X, 'john)? // find john's mother
mother('jane, 'X)? // find's all of jane's children
สัญลักษณ์: -,!,?, และ & ถูกกำหนดเป็นวิธีการทั่วไป ใน C ++ เท่านั้น & จะใช้ได้ดังนั้นความพยายามในการจับคู่ DSL นี้กับ C ++ จะต้องใช้สัญลักษณ์บางอย่างที่ทำให้เกิดแนวคิดที่แตกต่างกันอยู่แล้ว
แน่นอนว่านี่เป็นการเปิด Scala ให้เป็นการละเมิดอีกประเภทหนึ่ง ใน Scala คุณสามารถตั้งชื่อวิธีการ $! & ^% หากคุณต้องการ
สำหรับภาษาอื่น ๆ ที่เช่น Scala มีความยืดหยุ่นในการใช้ฟังก์ชั่นที่ไม่ใช่คำและชื่อเมธอดดู Smalltalk ที่ไหนเช่น Scala ผู้ดำเนินการ "ทุกคนเป็นเพียงวิธีอื่นและ Haskell ซึ่งอนุญาตให้โปรแกรมเมอร์กำหนดลำดับความสำคัญและความยืดหยุ่นของชื่อที่ยืดหยุ่น ฟังก์ชั่น.