
هذه هي المقالة الأولى في سلسلة مقالاتي التي تغطي التغييرات في Scala 3.
بداية دعونا مع معظم الابتكارات المثيرة للجدل: الأقواس المعقوفة اختياري و
بناء الجملة جديدة للبنيات السيطرة.
تجعل الأقواس المتعرجة الاختيارية كود Scala أشبه ببايثون أو هاسكل ، والذي يستخدم المسافة البادئة لتعبيرات المجموعة. دعونا نلقي نظرة على أمثلة مأخوذة من الإصدار الثالث من كتابي Programming Scala ، والذي هو الآن قيد التحضير للنشر.
الأقواس المتعرجة الاختيارية
أولاً ، لنلق نظرة على التصريح عن نوع باستخدام الصيغة القديمة والجديدة. يعمل هذا أيضًا مع الحزم إذا أعلنا عن حزم متعددة في نفس الملف.
//
trait Monoid2[A] {
def add(a1: A, a2: A): A
def zero: A
}
//
trait Monoid3[A]:
def add(a1: A, a2: A): A
def zero: A
تشبه البنية الجديدة لغة بايثون إلى حد كبير ، وقد يكون الأمر محيرًا إذا قمت بالتبديل باستمرار بين اللغتين.
يمكنك مزج النمط القديم والجديد ، وسيقوم Dotty compiler (ستتم إعادة تسميته قريبًا إلى Scala 3) بتجميع هذه التعليمات البرمجية دون أخطاء.
. , =
, :
.
def m2(s: String): String = {
val result = s.toUpperCase
println(s"output: $result")
result
}
def m3(s: String): String =
val result = s.toUpperCase
println(s"output: $result")
result
:
Scala. , =
, . , .
partial functions, match expressions try-catch-finally ( ):
val o2:Option[Int] => Int = {
case Some(i) => i
case None => 0
}
val o3:Option[Int] => Int =
case Some(i) => i
case None => 0
0 match {
case 0 => "zero"
case _ => "other value"
}
0 match
case 0 => "zero"
case _ => "other value"
Scala Java. ? , , Python, Scala. , Python , , , Scala. data science, Python, data engineering, Scala. Scala Python .
, . , , , Scala . :
import scala.annotation.tailrec
@tailrec def loop(whileTrue: => Boolean)(f: => Unit): Unit =
f
if (whileTrue) loop(whileTrue)(f)
var i=5
loop(i > 0) {
println(i)
i -= 1
}
var j=5
loop(j > 0): // ERROR
println(j)
j -= 1
: "" . loop
while
. . (, .)
Programming Scala, , . , - Scala 3, . , . Scala- . , : Scala Python ( Haskell) — .
, if
, for
while
. :
for (i <- 0 until 5) println(i) //
for i <- 0 until 5 do println(i) //
for i <- 0 until 5 yield 2*i
for i <- 0 until 10
if i%2 == 0
ii = 2*i
yield ii
val i = 10
if (i < 10) println("yes") //
else println("no")
if i < 10 then println("yes") //
else println("no")
for
while
, do
. for
yield
. if
then
.
. -new-syntax
, -old-syntax
— .
-rewrite
, , , .
. , .
Scala 2, . , , . . Java- - , .
, - . .