דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. נתקלתי אתמול בבאג חמוד

נתקלתי אתמול בבאג חמוד

מתוזמן נעוץ נעול הועבר תכנות
16 פוסטים 8 כותבים 702 צפיות 10 עוקבים
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
תגובה
  • תגובה כנושא
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • קומפיונטק קומפיונט

    בחזרה לנושא המקורי
    משהו יכול להסביר מה זה שונה מ foreach או מ:

    for (int i = 0; i < 3; i++)
    {
        var j = i;
        list.Add(() => Console.WriteLine(j));
    }
    

    שזה מפיק: [2 ,1 ,0]

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

    חגיח מנותק
    חגיח מנותק
    חגי
    כתב נערך לאחרונה על ידי חגי
    #7

    @קומפיונט
    בגלל ש j הוא לוקלי, אבל i לא, הוא מוצהר מחוץ ללולאה.
    אז יש לך רפרנס שונה ל-j בכל ריצה. ורק אחד ל-i לכל הריצות.

    קומפיונטק תגובה 1 תגובה אחרונה
    3
    • dovidD dovid פיצל נושא זה
    • חגיח חגי

      @קומפיונט
      בגלל ש j הוא לוקלי, אבל i לא, הוא מוצהר מחוץ ללולאה.
      אז יש לך רפרנס שונה ל-j בכל ריצה. ורק אחד ל-i לכל הריצות.

      קומפיונטק מנותק
      קומפיונטק מנותק
      קומפיונט
      כתב נערך לאחרונה על ידי
      #8

      @חגי אתה מתכוונן שלמשתנה i יש סקופ יותר ארוך מ - j, אבל בפועל שניהם משתנים לוקאליים.

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

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

      אפשר לאמת את זה על ידי בדיקת כתובות האובייקטים ברשימה.

      תגובה 1 תגובה אחרונה
      0
      • dovidD מנותק
        dovidD מנותק
        dovid
        ניהול
        כתב נערך לאחרונה על ידי dovid
        #9

        @קומפיונט "לוקלי" זה בדיוק אורך הסקופ (לא מכיר משמעות אחרת למילה לוקלי בC#).
        בכל איטרציה נוצר משתנה חדש j. פונקציית הלמבדה שנוצרת בכל איטרציה לוכדת את הרפרנס למשתנה שונה בכל פעם (שלכולם קוראים j אבל הם מקומות נפרדים בזיכרון).
        בכל מקרה לכידה של משתנים בסקופ היא תמיד רפרנס למשתנה ואף פעם לא העתקת ערך - שינוי של הערך במשתנה ישפיע תמיד על הפונקציה הלוכדת (וגם לכן זה מעכב את איסופם באספן הזבל כל עוד יש מצביע חי לפונקציה).

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

        • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
        • בכל נושא אפשר ליצור קשר dovid@tchumim.com
        קומפיונטק Y.Excel.AccessY 2 תגובות תגובה אחרונה
        3
        • dovidD dovid

          @קומפיונט "לוקלי" זה בדיוק אורך הסקופ (לא מכיר משמעות אחרת למילה לוקלי בC#).
          בכל איטרציה נוצר משתנה חדש j. פונקציית הלמבדה שנוצרת בכל איטרציה לוכדת את הרפרנס למשתנה שונה בכל פעם (שלכולם קוראים j אבל הם מקומות נפרדים בזיכרון).
          בכל מקרה לכידה של משתנים בסקופ היא תמיד רפרנס למשתנה ואף פעם לא העתקת ערך - שינוי של הערך במשתנה ישפיע תמיד על הפונקציה הלוכדת (וגם לכן זה מעכב את איסופם באספן הזבל כל עוד יש מצביע חי לפונקציה).

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

          קומפיונטק מנותק
          קומפיונטק מנותק
          קומפיונט
          כתב נערך לאחרונה על ידי קומפיונט
          #10

          אני משאיר את זה פה למי שבכל זאת אוהב לראות איך זה קורא בפועל.

          @dovid כתב בנתקלתי אתמול בבאג חמוד:

          חוטא לשפת C#

          ובלבד שיכוון ליבו

          אורחלא E 2 תגובות תגובה אחרונה
          1
          • קומפיונטק קומפיונט

            אני משאיר את זה פה למי שבכל זאת אוהב לראות איך זה קורא בפועל.

            @dovid כתב בנתקלתי אתמול בבאג חמוד:

            חוטא לשפת C#

            ובלבד שיכוון ליבו

            אורחלא מנותק
            אורחלא מנותק
            אורחל
            כתב נערך לאחרונה על ידי
            #11

            @קומפיונט חזק

            תגובה 1 תגובה אחרונה
            0
            • קומפיונטק קומפיונט

              אני משאיר את זה פה למי שבכל זאת אוהב לראות איך זה קורא בפועל.

              @dovid כתב בנתקלתי אתמול בבאג חמוד:

              חוטא לשפת C#

              ובלבד שיכוון ליבו

              E מנותק
              E מנותק
              eido
              כתב נערך לאחרונה על ידי
              #12
              פוסט זה נמחק!
              תגובה 1 תגובה אחרונה
              0
              • dovidD dovid

                @קומפיונט "לוקלי" זה בדיוק אורך הסקופ (לא מכיר משמעות אחרת למילה לוקלי בC#).
                בכל איטרציה נוצר משתנה חדש j. פונקציית הלמבדה שנוצרת בכל איטרציה לוכדת את הרפרנס למשתנה שונה בכל פעם (שלכולם קוראים j אבל הם מקומות נפרדים בזיכרון).
                בכל מקרה לכידה של משתנים בסקופ היא תמיד רפרנס למשתנה ואף פעם לא העתקת ערך - שינוי של הערך במשתנה ישפיע תמיד על הפונקציה הלוכדת (וגם לכן זה מעכב את איסופם באספן הזבל כל עוד יש מצביע חי לפונקציה).

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

                Y.Excel.AccessY מנותק
                Y.Excel.AccessY מנותק
                Y.Excel.Access
                כתב נערך לאחרונה על ידי Y.Excel.Access
                #13

                @dovid כתב בנתקלתי אתמול בבאג חמוד:

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

                נשמע קצת חמור מה שאמרת, איך ב C# המפורשת והבדוקה זה אמור להיות תקני..

                ב RUST זה לא יכל לקרות.

                let mut list = Vec::new();
                        for i in 0..3    
                        {
                            list.push(move || println!("{}", i)); // move  זה המשמעות של לקיחת בעלות, ומספר מממש Copy
                        }
                        list.iter_mut().for_each(|x| x());
                
                
                    // דוגמה נוספת, עם סוג ערך שלא מיישם Copy והמהדר מזהה את הבאג:
                    let mut list_str = Vec::new();
                    
                    // for s in ["a".to_string(), "b".to_string(), "c".to_string()].iter() // לא עובר קומפילציה כי זה אורך החיים של המערך הוא רק בתוך הלולאה, ואני משאיל בלבד ומייצא את זה החוצה לרשימה
                    // for s in ["a".to_string(), "b".to_string(), "c".to_string()].iter().cloned() // כן עובר קומפילציה כי זה משכפל את המערך, ואז אפשר לייצא את זה החוצה
                    for s in ["a".to_string(), "b".to_string(), "c".to_string()].into_iter() // עובר קומפילציה כי אני לא משאיל אלא משתמש בערך עצמו, ומייצא את זה החוצה
                    {
                        list_str.push(move || println!("{}", s));
                        // let mut s = s; // שורה זו לא אפשרית כי כבר ייצאתי החוצה את הערך
                    }
                    list_str.iter().for_each(|x| x());
                

                (אני יודע שבקוד כאן השתמשתי בforeach - כי אין for רגיל ב RUST. אבל הרעיון - איך נוצר כזה בלבול עם הרפרנס ב C#?)

                Y.Excel.Access @ gmail.com

                קומפיונטק תגובה 1 תגובה אחרונה
                0
                • Y.Excel.AccessY Y.Excel.Access

                  @dovid כתב בנתקלתי אתמול בבאג חמוד:

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

                  נשמע קצת חמור מה שאמרת, איך ב C# המפורשת והבדוקה זה אמור להיות תקני..

                  ב RUST זה לא יכל לקרות.

                  let mut list = Vec::new();
                          for i in 0..3    
                          {
                              list.push(move || println!("{}", i)); // move  זה המשמעות של לקיחת בעלות, ומספר מממש Copy
                          }
                          list.iter_mut().for_each(|x| x());
                  
                  
                      // דוגמה נוספת, עם סוג ערך שלא מיישם Copy והמהדר מזהה את הבאג:
                      let mut list_str = Vec::new();
                      
                      // for s in ["a".to_string(), "b".to_string(), "c".to_string()].iter() // לא עובר קומפילציה כי זה אורך החיים של המערך הוא רק בתוך הלולאה, ואני משאיל בלבד ומייצא את זה החוצה לרשימה
                      // for s in ["a".to_string(), "b".to_string(), "c".to_string()].iter().cloned() // כן עובר קומפילציה כי זה משכפל את המערך, ואז אפשר לייצא את זה החוצה
                      for s in ["a".to_string(), "b".to_string(), "c".to_string()].into_iter() // עובר קומפילציה כי אני לא משאיל אלא משתמש בערך עצמו, ומייצא את זה החוצה
                      {
                          list_str.push(move || println!("{}", s));
                          // let mut s = s; // שורה זו לא אפשרית כי כבר ייצאתי החוצה את הערך
                      }
                      list_str.iter().for_each(|x| x());
                  

                  (אני יודע שבקוד כאן השתמשתי בforeach - כי אין for רגיל ב RUST. אבל הרעיון - איך נוצר כזה בלבול עם הרפרנס ב C#?)

                  קומפיונטק מנותק
                  קומפיונטק מנותק
                  קומפיונט
                  כתב נערך לאחרונה על ידי
                  #14
                  פוסט זה נמחק!
                  Y.Excel.AccessY תגובה 1 תגובה אחרונה
                  0
                  • קומפיונטק קומפיונט

                    פוסט זה נמחק!

                    Y.Excel.AccessY מנותק
                    Y.Excel.AccessY מנותק
                    Y.Excel.Access
                    כתב נערך לאחרונה על ידי
                    #15

                    @קומפיונט כתב בנתקלתי אתמול בבאג חמוד:

                    @Y.Excel.Access שים לב מה ה - LLM כתב לך בהערה של שורה 4...

                    לא השתמשתי בשום AI כדי לכתוב את הכמה שורות האלו!

                    ובקשר להערה שלך - לכן הבאתי עוד דוגמה של String שלא מממש Copy.

                    Y.Excel.Access @ gmail.com

                    קומפיונטק תגובה 1 תגובה אחרונה
                    0
                    • Y.Excel.AccessY Y.Excel.Access

                      @קומפיונט כתב בנתקלתי אתמול בבאג חמוד:

                      @Y.Excel.Access שים לב מה ה - LLM כתב לך בהערה של שורה 4...

                      לא השתמשתי בשום AI כדי לכתוב את הכמה שורות האלו!

                      ובקשר להערה שלך - לכן הבאתי עוד דוגמה של String שלא מממש Copy.

                      קומפיונטק מנותק
                      קומפיונטק מנותק
                      קומפיונט
                      כתב נערך לאחרונה על ידי
                      #16

                      @Y.Excel.Access כתב בנתקלתי אתמול בבאג חמוד:

                      לא השתמשתי בשום AI כדי לכתוב את הכמה שורות האלו!

                      אופסס, סליחה שחשדתי...

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


                      בא תתחבר לדף היומי!
                      • התחברות

                      • אין לך חשבון עדיין? הרשמה

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