التحويل بين الأنواع
Option وEither وTry
التحويل بين الأنواع درس مجاني في Scala for Backend Engineering & Functional Programming على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Scala for Backend Engineering & Functional Programming، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Scala for Backend Engineering & Functional Programming 4 دروس في المجموع.
ثلاثة نماذج للأخطاء
يوفّر Scala ثلاثة أنواع متكاملة لتمثيل الغياب والفشل:
Option— وجود أو غياب (من دون سبب).Either— نجاح أو خطأ ذي نوع محدد.Try— نجاح أو استثناء مطروح.
ومعرفة كيفية التحويل بينها تتيح لكم تكييف واجهة برمجية مع أخرى.
التحويل من Option إلى Either
تحوّل toRight قيمة Option إلى Either، مع توفير خطأ من نوع Left في حالة None. أما toLeft فتنفّذ التحويل العكسي.
@main def run(): Unit = {
val some: Option[Int] = Some(5)
val none: Option[Int] = None
println(some.toRight("missing"))
println(none.toRight("missing"))
}Either إلى Option
تُسقط toOption الخطأ: إذ تتحول Right(x) إلى Some(x)، وتتحول Left(_) إلى None. استخدمها عندما لا يعود سبب الفشل مهمًا.
@main def run(): Unit = {
val r: Either[String, Int] = Right(42)
val l: Either[String, Int] = Left("err")
println(r.toOption)
println(l.toOption)
}Try إلى Option
تحوّل Try.toOption قيمة Success إلى Some وقيمة Failure إلى None، مع تجاهل الاستثناء.
import scala.util.Try
@main def run(): Unit = {
println(Try("7".toInt).toOption)
println(Try("x".toInt).toOption)
}Try إلى Either
تنتج Try.toEither قيمة من النوع Either[Throwable, T]: تتحول Success إلى Right، وتتحول Failure إلى Left(throwable). وبذلك يُحفَظ الاستثناء داخل قيمة يسارية ذات نوع محدد.
import scala.util.Try
@main def run(): Unit = {
val ok = Try("7".toInt).toEither
val no = Try("x".toInt).toEither
println(ok)
println(no.left.map(_.getMessage))
}Either إلى Try
لا توجد دالة مضمّنة مباشرة لتحويل Either إلى Try عند وجود خطأ عادي، لكن يمكنكم بناء واحدة: غلّفوا Right داخل Success، وLeft داخل Failure يحمل استثناءً.
import scala.util.{Try, Success, Failure}
object Main {
def toTry(e: Either[String, Int]): Try[Int] = e match {
case Right(v) => Success(v)
case Left(m) => Failure(new RuntimeException(m))
}
def main(args: Array[String]): Unit = {
println(toTry(Right(1)))
println(toTry(Left("bad")))
}
}Option إلى Try
حوّلوا Option إلى Try باختيار استثناء لحالة القيمة الفارغة. يفيد ذلك عندما تتوقع واجهة برمجية قيمة من النوع Try.
import scala.util.{Try, Success, Failure}
object Main {
def toTry[A](o: Option[A]): Try[A] = o match {
case Some(v) => Success(v)
case None => Failure(new NoSuchElementException("empty"))
}
def main(args: Array[String]): Unit = {
println(toTry(Some(9)))
println(toTry(None))
}
}توحيد مسار المعالجة
يؤدي خلط الأنواع إلى تعقيد التعامل معها. ومن الأساليب الشائعة تحويل كل شيء مبكرًا إلى Either باستخدام نوع موحّد للأخطاء، ثم تركيب القيم بحرية.
import scala.util.Try
object Main {
def parse(s: String): Either[String, Int] =
Try(s.toInt).toEither.left.map(_ => s"invalid: $s")
def lookup(n: Int): Either[String, String] =
Map(1 -> "one", 2 -> "two").get(n).toRight(s"no entry for $n")
def main(args: Array[String]): Unit = {
val result = for {
n <- parse("2")
w <- lookup(n)
} yield w
println(result)
}
}getOrElse عبر الأنواع
تدعم الأنواع الثلاثة getOrElse لاستخراج قيمة أو توفير قيمة افتراضية. وغالبًا ما تكون هذه الخطوة النهائية التي تخرج من عالم معالجة الأخطاء.
import scala.util.Try
@main def run(): Unit = {
val a = Some(1).getOrElse(0)
val b = (Right(2): Either[String, Int]).getOrElse(0)
val c = Try("x".toInt).getOrElse(0)
println(s"$a $b $c")
}اختيار النوع المناسب
إرشادات:
- استخدموا Option عندما لا يحتاج الغياب إلى تفسير.
- استخدموا Either عندما تريدون قيمة خطأ خاصة بالمجال.
- استخدموا Try عند الحدود التي تتعامل مع شيفرة Java أو المكتبات التي ترمي استثناءات.
مثال متكامل من البداية إلى النهاية
قراءة شيفرة ترمي استثناءات باستخدام Try، ثم تحويلها إلى Either لأخطاء المجال، وأخيرًا إلى Option لمستدعٍ لا يهتم إلا بوجود القيمة.
import scala.util.Try
object Main {
def safeDiv(a: Int, b: Int): Option[Int] =
Try(a / b).toEither.left.map(_ => "math error").toOption
def main(args: Array[String]): Unit = {
println(safeDiv(10, 2))
println(safeDiv(10, 0))
}
}تحقق سريع
اختبروا معرفتكم بالتحويل بين الأنواع.
مراجعة
لقد تعلمتم التحويل بين Option وEither وTry:
Option.toRight→ Either؛ وEither.toOption→ Option.- تصل
Try.toOptionوTry.toEitherبين الاستثناءات والقيم. - وحّدوا مسار المعالجة إلى نوع واحد للأخطاء في وقت مبكر.
- اختاروا النوع الذي يناسب مقدار تفاصيل الخطأ التي تحتاجون إليها.
تعلم Scala مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 39
- الدروس
- 143
الأسئلة الشائعة
هل درس «التحويل بين الأنواع» مجاني؟
نعم — نص درس «التحويل بين الأنواع» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Scala for Backend Engineering & Functional Programming، انتقل إلى CoddyKit PRO. تتضمن دورة Scala for Backend Engineering & Functional Programming 4 دروس في المجموع.
ماذا ستتعلم في «التحويل بين الأنواع»؟
Option وEither وTry تتمرن على Scala for Backend Engineering & Functional Programming مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Scala for Backend Engineering & Functional Programming؟
لا تُشترط خبرة سابقة. Scala for Backend Engineering & Functional Programming على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «التحويل بين الأنواع»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Scala for Backend Engineering & Functional Programming هذا؟
نعم. كل درس في Scala for Backend Engineering & Functional Programming يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- Either لمعالجة الأخطاء
- Try وSuccess وFailure
- تركيب Either
- التحويل بين الأنواع