מדריך לחסימת "מתי {}" בקוטלין

1. הקדמה

הדרכה זו מציגה את מתי{} לחסום בשפת קוטלין ומדגים את הדרכים השונות בהן ניתן להשתמש בו.

כדי להבין את החומר במאמר זה, יש צורך בידע בסיסי בשפת קוטלין. אתה יכול להסתכל במבוא למאמר שפת קוטלין על Baeldung כדי ללמוד עוד על השפה.

2. של קוטלין מתי{} לַחסוֹם

מתי{} בלוק הוא למעשה צורה מתקדמת של מארז מתג הצהרה ידועה מג'אווה.

בקוטלין, אם נמצא מקרה תואם, רק הקוד בגוש התיק המתאים מבוצע והביצוע ממשיך בהצהרה הבאה לאחר מתי לַחסוֹם. פירושו של דבר הוא שאין צורך בהצהרות הפסקה בסוף כל אחת מהן מקרה לַחסוֹם.

כדי להדגים את השימוש ב- מתי{}בואו נגדיר מחלקת enum המחזיקה את האות הראשונה בשדה ההרשאות עבור חלק מסוגי הקבצים ב- Unix:

מחלקת enum UnixFileType {D, HYPHEN_MINUS, L} 
בואו נגדיר היררכיה של מחלקות המדגימות את סוגי הקבצים המתאימים של יוניקס:
מחלקה אטומה UnixFile {מופשט כיף getFileType (): UnixFileType מחלקה RegularFile (תוכן val: מחרוזת): UnixFile () {לעקוף כיף getFileType (): UnixFileType {להחזיר UnixFileType.HYPHEN_MINUS}} מדריך מחלקה (ילדים ילדים: רשימה): UnixFile () {לעקוף כיף getFileType (): UnixFileType {להחזיר UnixFileType.D}} מחלקה SymbolicLink (val originalFile: UnixFile): UnixFile () {לעקוף כיף getFileType (): UnixFileType {להחזיר UnixFileType.L}}} 

2.1. מתי{} כביטוי

הבדל גדול מהצהרת המתג של Java הוא בכך ה מתי{} בלוק בקוטלין יכול לשמש גם כהצהרה וגם כביטוי. קוטלין עוקב אחר עקרונות השפות הפונקציונליות האחרות ומבני בקרת הזרימה הם ביטויים ותוצאת הערכתם יכולה להיות מוחזרת למתקשר.

אם הערך שהוחזר הוקצה למשתנה, המהדר יבדוק שסוג ערך ההחזרה תואם לסוג הצפוי על ידי הלקוח ויודיע לנו במקרה שהוא אינו:

@Test fun testWhenExpression () {val directoryType = UnixFileType.D val objectType = when (directoryType) {UnixFileType.D -> "d" UnixFileType.HYPHEN_MINUS -> "-" UnixFileType.L -> "l"} assertEquals ("d ", objectType)} 

יש לשים לב לשני דברים כשמשתמשים בביטוי בקוטלין.

ראשית, הערך המוחזר למתקשר הוא הערך של גוש המקרה התואם או במילים אחרות הערך שהוגדר לאחרונה בבלוק.

הדבר השני שיש לשים לב אליו הוא שעלינו להבטיח שהמתקשר יקבל ערך. כדי שזה יקרה עלינו להבטיח שהמקרים, בבלוק ה- When, מכסים כל ערך אפשרי שניתן להקצות לוויכוח.

2.2. מתי{} כביטוי עם מקרה ברירת מחדל

מקרה ברירת מחדל יתאים לכל ערך ארגומנט שאינו תואם למקרה רגיל ובקוטלין מוכרז באמצעות ה- אַחֵר סָעִיף. בכל מקרה, מהדר קוטלין יניח שכל ערך טיעון אפשרי מכוסה על ידי חסימת ה- When ויתלונן במקרה שלא.

כדי להוסיף מקרה ברירת מחדל בקוטלין מתי ביטוי:

@Test fun testWhenExpressionWithDefaultCase () {val fileType = UnixFileType.L val result = when (fileType) {UnixFileType.L -> "מקשר לקובץ אחר" אחר -> "לא קישור"} assertEquals ("מקשר לקובץ אחר", תוצאה)} 

2.3. מתי {} ביטוי עם מקרה שזורק חריג

בקוטלין, לזרוק מחזירה ערך מסוג שום דבר.

במקרה הזה, שום דבר משמש כדי להכריז שהביטוי לא הצליח לחשב ערך. שום דבר הוא הסוג שעובר בירושה מכל הסוגים המוגדרים על ידי המשתמש והמובנים בקוטלין.

לכן, מכיוון שהסוג תואם לכל טיעון בו נשתמש ב- מתי לחסום, זה תקף לחלוטין לזרוק חריג מ- מקרה אפילו אם ה מתי בלוק משמש כביטוי.

בואו נגדיר ביטוי מתי שבו אחד המקרים יוצא חריג:

@Test (צפוי = IllegalArgumentException :: class) כיף testWhenExpressionWithThrowException () {val fileType = UnixFileType.L תוצאת val: בוליאנית = כאשר (fileType) {UnixFileType.HYPHEN_MINUS -> אחר אמיתי -> לזרוק קובץ IllegalArgumentException (") }} 

2.4. מתי{} משמש כהצהרה

אנחנו יכולים גם להשתמש ב- מתי חסום כהצהרה.

במקרה זה, איננו צריכים לכסות את כל הערכים האפשריים עבור הוויכוח ואת הערך המחושב בכל חסימת מקרה, אם בכלל, פשוט מתעלמים ממנו. כאשר משתמשים בהצהרה, מתי ניתן להשתמש בדומה לאופן שבו החלף הצהרה משמשת ב- Java.

בואו נשתמש ב- מתי חסום כהצהרה:

@Test fun testWhenStatement () {val fileType = UnixFileType.HYPHEN_MINUS when (fileType) {UnixFileType.HYPHEN_MINUS -> println ("סוג קובץ רגיל") UnixFileType.D -> println ("סוג קובץ הספריה")}} 

אנו יכולים לראות מהדוגמה כי אין חובה לכסות את כל ערכי הטיעון האפשריים כאשר אנו משתמשים מתי כהצהרה.

2.5. שילוב מתי{} תיקים

של קוטלין מתי הביטוי מאפשר לנו לשלב מקרים שונים לאחד על ידי שרשור תנאי ההתאמה עם פסיק.

רק מקרה אחד צריך להתאים לביצוע גוש הקוד המתאים, ולכן הפסיק משמש כ- אוֹ מַפעִיל.

בואו ניצור מקרה שמשלב שני תנאים:

@Test fun testCaseCombination () {val fileType = UnixFileType.D val frequentFileType: Boolean = when (fileType) {UnixFileType.HYPHEN_MINUS, UnixFileType.D -> true else -> false} assertTrue (frequentFileType)} 

2.6. מתי{} משמש ללא ויכוח

קוטלין מאפשר לנו להשמיט את ערך הטיעון ב- מתי לַחסוֹם.

זה בעצם הופך כאשר זה פשוט אם-אחרת אם ביטוי שבודק ברצף מקרים ומבצע את גוש הקוד של המקרה התואם הראשון. אם נשמיט את הטיעון בבלוק ה- When, אז ביטויי המקרה צריכים להעריך נכון או לא נכון.

בואו ניצור מתי חסום שמשמיט את הטיעון:

@Test fun testWhenWithoutArgument () {val fileType = UnixFileType.L val objectType = when {fileType === UnixFileType.L -> "l" fileType === UnixFileType.HYPHEN_MINUS -> "-" fileType === UnixFileType.D - > "d" אחר -> "סוג קובץ לא ידוע"} assertEquals ("l", objectType)} 

2.7. ביטויי מקרה דינמי

בג'אווה, ה- החלף הצהרה יכולה לשמש רק עם פרימיטיביים וסוגי הקופסאות שלהם, enums ו- חוּט מעמד. בניגוד, קוטלין מאפשר לנו להשתמש ב- מתי לחסום עם כל סוג מובנה או מוגדר על ידי המשתמש.

בנוסף, לא נדרש שהמקרים הם ביטויים קבועים כמו בג'אווה. מקרים בקוטלין יכולים להיות ביטויים דינמיים המוערכים בזמן הריצה. לדוגמא, מקרים יכולים להיות תוצאה של פונקציה כל עוד סוג החזרת הפונקציה תואם לסוג ה- מתי לחסום ויכוח.

בואו נגדיר א מתי חסום עם ביטויי מקרה דינמיים:

@Test fun testDynamicCaseExpression () {val unixFile = UnixFile.SymbolicLink (UnixFile.RegularFile ("Content")) כאשר {unixFile.getFileType () == UnixFileType.D -> println ("זו ספריה!") UnixFile.getFileType ( ) == UnixFileType.HYPHEN_MINUS -> println ("זה קובץ רגיל!") UnixFile.getFileType () == UnixFileType.L -> println ("זה קישור רך!")}} 

2.8. ביטויי מקרה ומגוון אוספים

אפשר להגדיר מקרה ב- a מתי חסום שבודק אם אוסף נתון או טווח ערכים מכילים את הארגומנט.

מסיבה זו, קוטלין מספק את ב מפעיל, שהוא סוכר תחבירי עבור מכיל () שיטה. המשמעות היא שמאחורי הקלעים, קוטלין מתרגם את אלמנט המקרה ב ל collection.contains (אלמנט).

כדי לבדוק אם הטיעון נמצא ברשימה:

@Test fun testCollectionCaseExpressions () {val regularFile = UnixFile.RegularFile ("Content Test") val symbolicLink = UnixFile.SymbolicLink (regularFile) directory directory = UnixFile.Directory (listOf (regularFile, symbolicLink)) val isRegularFileInDirectory = כאשר (regularFile) בספריה.ילדים -> נכון אחר -> שקר} val isSymbolicLinkInDirectory = כאשר {symbolicLink בספריה.ילדים -> נכון אחר -> שקר} assertTrue (isRegularFileInDirectory) assertTrue (isSymbolicLinkInDirectory)} 
כדי לבדוק שהוויכוח נמצא בטווח:
@Test fun testRangeCaseExpressions () {val fileType = UnixFileType.HYPHEN_MINUS val isCorrectType = when (fileType) {in UnixFileType.D..UnixFileType.L -> true else -> false} assertTrue (isCorrectType)} 

למרות ש REGULAR_FILE הסוג אינו כלול במפורש בטווח, הסדר שלו נמצא בין המסדרים של מַדרִיך ו SYMBOLIC_LINK ולכן המבחן מוצלח.

2.9. האם מפעיל תיקים וקאסט חכם

אנחנו יכולים להשתמש בקוטלין הוא המפעיל לבדוק אם הארגומנט הוא מופע מסוג מוגדר. ה הוא דומה למפעיל מופע של מפעיל בג'אווה.

עם זאת, קוטלין מספק לנו תכונה הנקראת "שחקנים חכמים". לאחר שנבדוק אם הארגומנט הוא מופע מסוג מסוים, איננו צריכים להעביר את הארגומנט במפורש לסוג זה מכיוון שהמהדר עושה זאת עבורנו.

לכן, אנו יכולים להשתמש בשיטות ובמאפיינים המוגדרים בסוג הנתון ישירות בגוש המקרה.

כדי להשתמש באופרטור is עם התכונה "smart cast" ב- מתי לַחסוֹם:

@Test fun testWhenWithIsOperatorWithSmartCase () {val unixFile: UnixFile = UnixFile.RegularFile ("תוכן הבדיקה") val result = when (unixFile) {is UnixFile.RegularFile -> unixFile.content is UnixFile.Directory -> unixFile. it.getFileType ()} .joinToString (",") הוא UnixFile.SymbolicLink -> unixFile.originalFile.getFileType ()} assertEquals ("תוכן הבדיקה", תוצאה)} 
בלי ליהוק מפורש unixFile ל RegularFile, מַדרִיך אוֹ SymbolicLinkהצלחנו להשתמש RegularFile.content, מדריך.ילדים, ו SymbolicLink.originalFile בהתאמה.

2.10. מתי ביטויים ולולאות

נכון לקוטלין 1.4, אפשר לשבור אוֹ לְהַמשִׁיך לולאה אפילו בתוך a מתי ביטוי. לדוגמה:

val colours = setOf ("Red", "Green", "Blue") עבור (color in colours) {when (color) {"Red" -> break "Green" -> המשך "Blue" -> println ("This הוא כחול") } }

בדוגמה שלעיל, לשבור מסיים את הלולאה הסוגרת הקרובה ביותר ואת לְהַמשִׁיך ממשיך לשלב הבא, כצפוי. לפני Kotlin 1.4, לעומת זאת, רק העפיל לשבור ו לְהַמשִׁיך הורשו להכנס לא מתי ביטוי בתוך לולאה:

[דוא"ל מוגן] עבור (צבע בצבעים) {כאשר (צבע) {"אדום" -> [דוא"ל מוגן] "ירוק" -> [דוא"ל מוגן] "כחול" -> println ("זה כחול")}}

כפי שמוצג לעיל, לשבור ו לְהַמשִׁיך מוסמכים עם @לוּלָאָה ביטוי.

3. מסקנה

במאמר זה ראינו כמה דוגמאות כיצד להשתמש ב- מתי חסימה המוצעת על ידי שפת קוטלין.

למרות שלא ניתן לבצע התאמת תבניות באמצעות מתי בקוטלין, כפי שקורה במבנים המקבילים בסקאלה ובשפות JVM אחרות, מתי בלוק הוא רב תכליתי בכדי לגרום לנו לשכוח לחלוטין מהתכונות הללו

היישום המלא של הדוגמאות למאמר זה ניתן למצוא באתר GitHub.


$config[zx-auto] not found$config[zx-overlay] not found