قبل شهر ، حصلت على وظيفتي الأولى وأصبحت مطورًا متدربًا ، يستخدم فريقنا لغة Scala. يبدو لي أن جميع المطورين المبتدئين في اليوم الأول ضائعون. في الوقت نفسه ، تتراكم مجموعة من الأسماء والتقنيات وبعض القواعد الجديدة ، ولا تعرف أبدًا أي شيء ، فكل شيء جديد عليك تمامًا ، هذا هو العمل الأول. في حالتي ، ما زلت لا أعرف اللغة التي أود أن أبرمج بها ، حتى المقابلة التي لم أسمع بها من قبل. خلاصة القول: في اليوم الأول كنت كاملة. اسأل كيف حصلت على هذه الوظيفة؟ كنت أعرف جافا ، في المقابلة التي قيل لي أن javista سوف تكون قادرة على الذهاب إلى الصخور بسهولة تامة ولا تقلق. لكن من الواضح أن الأمر كان يستحق بعض الإحباط ، لأنه في المرة الأولى التي رأيت فيها أمامي مجرد شاشات مليئة بالنص ، كان نصفها واضحًا على الفور.
لكن حتى حقيقة أنني لم أفهم شيئًا ما تسبب في المزيد من الانزعاج ، لكن حقيقة أن هناك اختلافًا كبيرًا ، وحتى نوع المتغير يأتي بعد الاسم ، وأحيانًا لا وجود له على الإطلاق.
final String str = "abc";
val str = "abc"
هكذا يتم وصف الوظيفة:
int sum(int a, int b) {return a+b;}
def sum(a: Int, b: Int) = {a + b}
ويحتوي Scala أيضًا على وحدة تحكم REPL (قراءة - طباعة - حلقة - طباعة) ، كما هو الحال ، على سبيل المثال ، في Python. كما لاحظت بالفعل ، فواصل منقوطة. يمكنك تشغيل برامج أحادية الصفحة بدون رئيسي ، يمكن أن تحتوي أسماء الطرق والمتغيرات على أي أحرف على الإطلاق ، ولا توجد قواعد. لا يوجد ثابت ، لكن يوجد كائن ، وهناك أيضًا كائنات أولية ، == يوجد فعليًا متساوي. إذا كانت الطريقة لا تحتوي على معلمات ، فليس من الضروري وضع حد لاستدعاء الطريقة ، وتكون الأقواس اختيارية أيضًا في حالة عدم وجود معلمات ، وإذا كانت تتطلب معلمة واحدة فقط ، فيمكنك الكتابة هكذا:
str.charAt(5);
str charAt 5
ومثال آخر مثير للاهتمام:
val res = 1 + 1
لا ، ليس فقط 1 زائد 1 ، هنا الكائن 1 ، يتم استدعاء الأسلوب + ويتم تمرير الكائن 1 إليها كمعلمة فقط ، بالنسبة لي ، كان هذا استراحة للقالب.
لقد صدمني كتاب رائع من تأليف ديفيد بولاك - البداية سكالا. يبدأ الكتاب بعبارة واحدة ، أدركت بعدها أنه يجب عليَّ قراءتها حتى النهاية:
أوتش! هذا يؤلم ذهني! التوقف عن صنع لي التفكير بشكل مختلف. أوه ، انتظر ... يؤلمني الآن. أنا أفهم ذلك. هذه الطريقة المختلفة لحل المشكلة لها بعض الفوائد. شعرت بهذه الطريقة بعد سنتي الأولى من كلية الحقوق. شعرت بهذه الطريقة لفترة من الوقت عندما بدأت ترميز سكالا.
ديفيد لديه خبرة هائلة في مجال البرمجة ، بدأ هذا العمل قبل 20 عامًا من ولادتي ، وتمكن من العمل مع أكثر من 10 لغات برمجة ، حتى جاء إلى سكالا. والآن يقول:
Scala هي لغة برمجة توفر أفضل تجربة للعالم للمطورين.
ومع ذلك ، فإن المؤلف يحذر بأمانة من أن إتقانها ليس بالأمر السهل ، فقد استغرق الأمر من ذلك عامين ، لكنه يأمل أن نتمكن من ذلك بشكل أسرع وسيساعد في ذلك. هذا ليس كتابًا بسيطًا جدًا ويتضمن بعض الخبرة في البرمجة مع القارئ. خصوصا أولئك الذين مبرمجين سابقا في جافا سوف يعجبهم ذلك ، لأنه هناك العديد من الإشارات إلى هذه اللغة ويمكن مقارنتها.
بالإضافة إلى Beginning Scala ، قرأت أيضًا دروس Twitter Scala School ، حيث توجد ترجمة إلى اللغة الروسية لجميع الدروس ، لكن كتاب David Pollack لم يكن موجودًا إلا في النسخة الإنجليزية.
ساعدت Scala Exercises في توحيد النظرية بالإضافة إلى الرحلات المستقلة حول مصدر الروك والعمل ، فهناك مهام بسيطة للغاية ، لكنها مناسبة تمامًا لإصلاح بعض الجوانب في البداية والتأكد من أنك قرأت وفهمت كل شيء بشكل صحيح بدقة.
وسأخبركم قليلاً عن أكثر الأشياء شيوعًا والبساطة التي كان علي فهمها في المقام الأول.
الخيار. باختصار - هذه عبارة عن حاوية تكون إما فارغة (بلا ، تبدو خالية) ، ولكنها تحتوي على طرق تعيين أو تصفية أو ...) أو قيمة معينة بالضبط ، بعض الأكاذيب (القيمة) واستخدامها يمكن أن يجعل الرمز أكثر أمانًا و عدم رمي NullPointerException ، لأنك لا ترغب في ذلك ، لكنك لا تزال بحاجة إلى استرداد البيانات النظيفة من Option ، ومن الصعب في هذه المرحلة بالفعل أن تنسى كتابة شيك.
بالطبع ، يحتوي Option على طريقة get ، لكن لا يوصى باستخدامها لأنه في هذه الحالة ، يتم فقد الخيار بالكامل ، لأنه None.get يلقي استثناء.
بعض من وسائل الراحة الأكثر وضوحا:
من السهل إرجاع القيمة الافتراضية إذا كان الخيار فارغًا
optValue.getOrElse(defaultValue)
في حال وجود أي إجراء:
optValue match { case Some(value) => action case None => defaultAction }
مثال من البداية Scala. المسار هو قاعدة بيانات معينة تحتوي على أنواع الأشخاص
def findPerson(key: Int): Option[Person]
ستقوم الطريقة بإرجاع بعض [الأشخاص] إذا تم العثور على مثل هذا الإدخال و لا شيء غير ذلك.
الآن نريد الحصول على عمر المستخدم حسب المفتاح.
def ageFromKey(key: Int): Option[Int] = findPerson(key).map(_.age)
لم يكن لدينا لاختبار لا شيء ، واتضح أن الطريقة كانت موجزة للغاية.
مطابقة النمط . في البداية ، اعتقدت أن هذا هو نفس مفتاح Java ولن أكاد أستخدمه ، لكنه ليس كذلك. في Scala ، هذا أحد التصميمات الأكثر استخدامًا.
نوع الصب:
obj match { case str: String => str case number: Int => number }
يمكنك إضافة شروط إضافية وإضافة إجراء افتراضي.
obj match { case strWithA: String if strWithA.contains("a") => strWithA case negative: Int if negative < 0 => negative case zero if zero == 0 => zero case _ => defaultAction }
أنها مريحة للغاية لاستخدام مطابقة نمط مع فئات القضية. مثال من البداية Scala
Stuff("David", 45) match { case Stuff("David", age) if age < 30 => "young David" case Stuff("David", _) => "old David" case _ => "Other" }
وظائفبادئ ذي بدء ، في Scala ، الدالات هي مثيلات تقوم بتنفيذ واجهة معينة ، أو بالأحرى تتبع FunctionX ، حيث يكون X هو عدد المعلمات ويستغرق قيمة من 1 إلى 22. في هذا الدرج ، تكون الطريقة الوحيدة هي aplly ، والتي تسمى الوظيفة. نظرًا لأن الدالات هي حالات عادية ، يمكننا تمريرها وإعادتها من الطرق والوظائف.
مثال من البداية Scala. نقوم بتمرير بعض الوظائف من Int إلى String ، وتقوم بإرجاع نتيجة هذه الدالة مع المعلمة 42.
def answer(f: Function1[Int, String]) = f(42)
أو نفس الشيء
def answer(f: Function1[Int, String]) = f.apply(42)
الشيء المريح للغاية هو الدمج الوظيفي /
اترك العناصر الإيجابية فقط في الصفيف:
arr.filter(value => value > 0)
مثال أكثر تعقيدا قليلا. احسب مجموع قيم الدالة f من العناصر الإيجابية للقائمة. 2 طرق للقيام بذلك:
list.filter(x => x > 0).foldLeft(0)(_ + f(_)) list.filter(x => x > 0).map(f).sum
وفي النهاية ، أود أن أقول لماذا كتبت كل هذا على الإطلاق. لا أريد أن أعلم أي شخص Scala أو أتحدث عن اللغة على هذا النحو ، فهناك الكثير من المقالات على Habré وعلى الإنترنت ، والكثير منها جيد ومفيد للغاية. كان هدفي مجرد سرد قصتي ، والتي قد تكون مثيرة للاهتمام لشخص ما ويمكن أن تساعد وتدعم بعضًا من نفس الوافد الجديد المفقود ، الذي اصطدم مصيره للتو بهذه الصخرة. اتمنى لك حظا سعيدا يتم تشجيع المبرمجين المتمرسين على مشاركة نصائحهم وآرائهم في التعليقات ، فيما يتعلق بمسار مبرمج Scala المبتدئ.