جدول المحتوى
إذا كان لديك فهم جيد لـ Java، فسيكون من السهل جدًا عليك تعلم Scala. أكبر اختلاف نحوي بين Scala وJava هو أن “;” حرف نهاية السطر اختياري.
عندما نفكر في برنامج Scala، يمكن تعريفه على أنه مجموعة من الكائنات التي تتواصل عبر استدعاء أساليب بعضها البعض. دعونا الآن نلقي نظرة سريعة على ما تعنيه متغيرات الفئة والكائن والأساليب ومتغيرات الحالة.
كائن Object – الكائنات لها حالات وسلوكيات. الكائن هو مثيل لفئة. مثال – للكلب حالات – اللون والاسم والسلالة بالإضافة إلى السلوكيات – الهز والنباح والأكل.
الفئة Class – يمكن تعريف الفئة على أنها قالب/مخطط يصف السلوكيات/الحالات المرتبطة بالفئة.
الأساليب Methods – الطريقة هي في الأساس سلوك. يمكن أن يحتوي الفصل على العديد من الأساليب. يتم ذلك من خلال الأساليب التي تتم فيها كتابة المنطق ومعالجة البيانات وتنفيذ جميع الإجراءات.
الحقول Fields – يحتوي كل كائن على مجموعة فريدة من متغيرات الحالة، والتي تسمى الحقول. يتم إنشاء حالة الكائن بواسطة القيم المخصصة لهذه الحقول.
الإغلاق Closure – الإغلاق هو دالة تعتمد قيمتها المرجعة على قيمة متغير واحد أو أكثر معلن عنها خارج هذه الوظيفة.
السمات Traits – تقوم السمة بتغليف تعريفات الطريقة والمجال، والتي يمكن بعد ذلك إعادة استخدامها عن طريق مزجها في فئات. تُستخدم السمات لتحديد أنواع الكائنات عن طريق تحديد توقيع الطرق المدعومة.
برنامج Scala الأول
يمكننا تنفيذ برنامج Scala في وضعين: أحدهما هو الوضع التفاعلي interactive mode والآخر هو وضع البرنامج النصي script mode.
الوضع التفاعلي Interactive Mode
افتح موجه الأوامر command prompt واستخدم الأمر التالي لفتح Scala.
\>scala
إذا تم تثبيت Scala في نظامك، فسيتم عرض الإخراج التالي
Welcome to Scala version 2.9.0.1
Type in expressions to have them evaluated.
Type :help for more information.
اكتب النص التالي على يمين موجه Scala واضغط على مفتاح Enter
scala> println("Hello, Scala!");
وسوف تنتج النتيجة التالية
Hello, Scala!
وضع البرنامج النصي Script Mode
استخدم الإرشادات التالية لكتابة برنامج Scala في وضع البرنامج النصي. افتح المفكرة وأضف الكود التالي فيها.
object HelloWorld {
/* This is my first java program.
* This will print 'Hello World' as the output
*/
def main(args: Array[String]) {
println("Hello, world!") // prints Hello World
}
}
احفظ الملف باسم – HelloWorld.scala.
افتح نافذة موجه الأوامر وانتقل إلى الدليل الذي تم حفظ ملف البرنامج فيه. يتم استخدام الأمر “scalac” لتجميع برنامج Scala وسيقوم بإنشاء عدد قليل من ملفات الفئة في الدليل الحالي. سيتم استدعاء واحد منهم HelloWorld.class. هذا هو رمز ثانوي سيتم تشغيله على Java Virtual Machine (JVM) باستخدام أمر “scala”.
استخدم الأمر التالي لتجميع وتنفيذ برنامج Scala الخاص بك.
\> scalac HelloWorld.scala
\> scala HelloWorld
ناتج تنفيذ الكود هو كمايلي.
Hello, World!
بناء الجملة الأساسي
فيما يلي بناء الجملة الأساسي واتفاقيات الترميز في برمجة Scala.
حساسية حالة الأحرف Case Sensitivity – إن لغة Scala حساسة لحالة الأحرف، مما يعني أن المعرف Hello وhello سيكون لهما معنى مختلف في Scala.
أسماء الفئات Class Names – بالنسبة لجميع أسماء الفئات، يجب أن يكون الحرف الأول بالأحرف الكبيرة. إذا تم استخدام عدة كلمات لتكوين اسم الفصل، فيجب أن يكون الحرف الأول من كل كلمة داخلية مكتوبًا بأحرف كبيرة.
مثال – فئة MyFirstScalaClass.
أسماء الطرق Method Names – يجب أن تبدأ جميع أسماء الطرق بحرف صغير. إذا تم استخدام كلمات متعددة لتكوين اسم الطريقة، فيجب أن يكون الحرف الأول من كل كلمة داخلية مكتوبًا بأحرف كبيرة.
مثال – تعريف myMethodName()
اسم ملف البرنامج Program File Name – يجب أن يتطابق اسم ملف البرنامج تمامًا مع اسم الكائن. عند حفظ الملف، يجب عليك حفظه باستخدام اسم الكائن (تذكر أن Scala حساس لحالة الأحرف) وإلحاق “.scala” بنهاية الاسم. (إذا كان اسم الملف واسم الكائن غير متطابقين، فلن يتم تجميع برنامجك).
مثال – افترض أن “HelloWorld” هو اسم الكائن. ثم يجب حفظ الملف باسم “HelloWorld.scala”.
def main(args: Array[String]) – تبدأ معالجة برنامج Scala من الطريقة main() والتي تعد جزءًا إلزاميًا من كل برنامج Scala.
معرفات سكالا Scala Identifiers
تتطلب جميع مكونات Scala أسماء. تسمى الأسماء المستخدمة للكائنات والفئات والمتغيرات والأساليب معرفات. لا يمكن استخدام الكلمة الأساسية كمعرف وتكون المعرفات حساسة لحالة الأحرف. يدعم Scala أربعة أنواع من المعرفات.
المعرفات الأبجدية الرقمية Alphanumeric Identifiers
يبدأ المعرف الأبجدي الرقمي بحرف أو شرطة سفلية، والتي يمكن أن تتبعها أحرف أو أرقام أو شرطات سفلية أخرى. يعد الحرف “$” كلمة رئيسية محجوزة في Scala ويجب عدم استخدامه في المعرفات.
فيما يلي المعرفات الأبجدية الرقمية المقبولة
age, salary, _value, __1_value
فيما يلي معرفات غير المقبولة
$salary, 123abc, -salary
معرفات المشغل Operator Identifiers
يتكون معرف عامل التشغيل من حرف عامل واحد أو أكثر. أحرف عامل التشغيل هي أحرف ASCII قابلة للطباعة مثل + أو : أو ? أو ~ أو #.
فيما يلي معرفات المشغل المقبولة.
+ ++ ::: <?> :>
سيقوم مترجم Scala “بتشويه” معرفات المشغل داخليًا لتحويلها إلى معرفات Java قانونية تحتوي على أحرف $ مضمنة. على سبيل المثال، سيتم تمثيل المعرف :-> داخليًا كـ $colon$minus$greater.
معرفات مختلطة Mixed Identifiers
يتكون المعرف المختلط من معرف أبجدي رقمي، يتبعه شرطة سفلية ومعرف عامل التشغيل.
فيما يلي المعرفات القانونية المختلطة
unary_+, myvar_=
هنا، unary_+ المستخدم كاسم طريقة يحدد عامل التشغيل unary + وmyvar_= المستخدم كاسم طريقة يحدد عامل التعيين (التحميل الزائد للمشغل).
المعرفات الحرفية Literal Identifiers
المعرف الحرفي عبارة عن سلسلة عشوائية محاطة بعلامات التجزئة الخلفية (. .
).
فيما يلي المعرفات الحرفية القانونية
`x` `<clinit>` `yield`
الكلمات المحجوزة في Scala
تعرض القائمة التالية الكلمات المحجوزة في Scala. لا يجوز استخدام هذه الكلمات المحجوزة كأسماء ثابتة أو متغيرة أو أي أسماء معرفات أخرى.
abstract | case | catch | class |
def | do | else | extends |
false | final | finally | for |
forSome | if | implicit | import |
lazy | match | new | Null |
object | override | package | private |
protected | return | sealed | super |
this | throw | trait | Try |
true | type | val | Var |
while | with | yield | |
– | : | = | => |
<- | <: | <% | >: |
# | @ |
التعليقات في لغة Scala
يدعم Scala التعليقات ذات السطر الواحد والمتعددة الأسطر المشابهة جدًا لـ Java. قد تكون التعليقات متعددة الأسطر متداخلة، ولكن يجب أن تكون متداخلة بشكل صحيح. يتم تجاهل كافة الأحرف المتوفرة داخل أي تعليق بواسطة مترجم Scala.
object HelloWorld {
/* This is my first java program.
* This will print 'Hello World' as the output
* This is an example of multi-line comments.
*/
def main(args: Array[String]) {
// Prints Hello World
// This is also an example of single line comment.
println("Hello, world!")
}
}
الأسطر الفارغة والمسافات الفارغة Blank Lines and Whitespace
يُعرف السطر الذي يحتوي على مسافة بيضاء فقط، ربما مع تعليق، بالسطر الفارغ، ويتجاهله Scala تمامًا. يمكن فصل الرموز المميزة بأحرف مسافات بيضاء و/أو تعليقات.
حرف أو علامة السطر الجديد
Scala هي لغة موجهة نحو الخط حيث يمكن إنهاء البيانات بفواصل منقوطة (؛) أو أسطر جديدة. عادةً ما تكون الفاصلة المنقوطة في نهاية العبارة اختيارية. يمكنك كتابة واحدة إذا أردت ولكن ليس عليك القيام بذلك إذا ظهرت العبارة بمفردها في سطر واحد. من ناحية أخرى، تكون الفاصلة المنقوطة مطلوبة إذا كتبت عبارات متعددة في سطر واحد. أدناه بناء الجملة هو استخدام عبارات متعددة.
val s = "hello"; println(s)
حزم سكالا Scala Packages
الحزمة عبارة عن وحدة نمطية مسماة من التعليمات البرمجية. على سبيل المثال، حزمة الأداة المساعدة Lift هي net.liftweb.util. إعلان الحزمة هو السطر الأول بدون تعليق في الملف المصدر على النحو التالي
package com.liftcode.stuff
يمكن استيراد حزم Scala بحيث يمكن الرجوع إليها في نطاق الترجمة الحالي. يقوم البيان التالي باستيراد محتويات حزمة scala.xml
import scala.xml._
يمكنك استيراد فئة وكائن واحد، على سبيل المثال، HashMap من الحزمة scala.collection.mutable
import scala.collection.mutable.HashMap
يمكنك استيراد أكثر من فئة أو كائن من حزمة واحدة، على سبيل المثال TreeMap وTreeSet من الحزمة scala.collection.immutable
import scala.collection.immutable.{TreeMap, TreeSet}
التطبيق الديناميكي Apply Dynamic
سمة علامة تتيح الاستدعاءات الديناميكية. تسمح مثيلات x من هذه السمة باستدعاءات الطريقة x.meth(args) لأسماء الطرق التعسفية meth وقوائم الوسيطات args بالإضافة إلى الوصول إلى الحقل x.field لحقل أسماء الحقول التعسفي. تم تقديم هذه الميزة في Scala-2.10.
إذا كانت المكالمة غير مدعومة أصلاً بواسطة x (أي إذا فشل التحقق من النوع)، فستتم إعادة كتابتها وفقًا للقواعد التالية
foo.method("blah") ~~> foo.applyDynamic("method")("blah")
foo.method(x = "blah") ~~> foo.applyDynamicNamed("method")(("x", "blah"))
foo.method(x = 1, 2) ~~> foo.applyDynamicNamed("method")(("x", 1), ("", 2))
foo.field ~~> foo.selectDynamic("field")
foo.varia = 10 ~~> foo.updateDynamic("varia")(10)
foo.arr(10) = 13 ~~> foo.selectDynamic("arr").update(10, 13)
foo.arr(10) ~~> foo.applyDynamic("arr")(10)