سؤال

في سكالا، لماذا يمكنني حذف نقطة و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". إذا قمت بإدراجه ذلك، ثم انها ستتقدم بشكوى يتطلب أن م أي حجة، أو إذا تعذر ذلك، و "_" لتحويله الى وظيفة تطبيقها جزئيا.

نصائح أخرى

وأعتقد أن أسلوب تركيب المشغل يعمل فقط عندما يكون لديك كائن صريح على الجانب الأيسر. ويهدف بناء الجملة لتمكنك من التعبير عن عمليات أسلوب "المعامل مشغل المعامل" بطريقة طبيعية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top