الأحرف التي يمكنني حذف في سكالا؟
سؤال
في سكالا، لماذا يمكنني حذف نقطة وbrakets في T m 0
(بدلا من T.m(0)
) في ما يلي؟
scala> object T { def m(i:Int) = 0 == i }
defined module T
scala> T m 0
res19: Boolean = true
ولكن لماذا لا يمكنني تجاهل brakets في n(0)
في ما يلي؟
scala> def n(i:Int) = 0 == i
n: (Int)Boolean
scala> n 0
<console>:1: error: ';' expected but integer literal found.
n 0
^
المحلول
والمثال السابق، T م 0، هو مثال على "تدوين المشغل". سكالا ثلاثة أنواع من الرموز المشغل، بادئة (وتسمى أحادي)، أقحم ولواحق. دعونا نرى أمثلة من كل ثلاثة في العمل هنا:
class MyByte(val n : Int) {
require(n >= 0 && n <= 255)
def unary_! = new MyByte(n ^ 0xff)
def +(m : MyByte) = new MyByte(n + m.n)
def bits = (math.log(n) / math.log(2) + 1).toInt
override def toString = "0" * (8 - bits) + n.toBinaryString
}
وهناك هنا أنه قيد الاستخدام:
scala> val a = new MyByte(5)
a: MyByte = 00000101
scala> val b = new MyByte(10)
b: MyByte = 00001010
scala> ! a // Prefix/Unary
res58: MyByte = 11111010
scala> a + b // Infix
res59: MyByte = 00001111
scala> b bits // Postfix
res60: Int = 4
وبينما أقحم وبوستفيكس الرموز تقبل أي معرف سكالا صحيح، وإن كان هناك حديث عن تقييد لواحق التدوين، معرفات أربعة فقط يمكن استخدام بادئة:!. ~،، - و+
والآن، عند محاولة "م 0"، سكالا يتجاهل كونها المشغل الأحادية، على أساس أنها ليست واحدة صالح (~،، - و+). وجدت أن "م" هو كائن صالح - بل هو وظيفة، وليس وسيلة، وجميع وظائف هي كائنات
وأما "0" ليس معرف سكالا صالح، فإنه لا يمكن أن يكون لا على أقحم ولا مشغل لواحق. ولذلك، سكالا يشكو أنه يتوقع "،" - الذي سيفصل اثنين (تقريبا) التعبيرات الصحيحة: "م" و "0". إذا قمت بإدراجه ذلك، ثم انها ستتقدم بشكوى يتطلب أن م أي حجة، أو إذا تعذر ذلك، و "_" لتحويله الى وظيفة تطبيقها جزئيا.
نصائح أخرى
وأعتقد أن أسلوب تركيب المشغل يعمل فقط عندما يكون لديك كائن صريح على الجانب الأيسر. ويهدف بناء الجملة لتمكنك من التعبير عن عمليات أسلوب "المعامل مشغل المعامل" بطريقة طبيعية.