متغیرهای سراسری

    متغیرهای سراسری در سطح بالاترین scope اعلان می‌شوند. آنها بسته به اصلاح‌کننده دید خود، در سراسر ماژول یا بسته قابل دسترسی هستند.

    دید (Visibility)

    • خصوصی (Private): بدون اصلاح‌کننده اعلان می‌شود؛ فقط درون ماژول جاری قابل دسترسی است.
    • عمومی (pub): از سایر ماژول‌ها یا فایل‌ها قابل دسترسی است.
    const VERSION = "1.0"; // private, immutable
    
    pub const COUNTER = 0; // public, immutable
    

    تغییرپذیری (Mutability)

    • const: پس از اعلان تغییرناپذیر است. تلاش برای تخصیص مجدد باعث خطای کامپایل می‌شود.
    • var: تغییرپذیر است؛ مقدار می‌تواند در طول چرخه حیات برنامه تغییر کند.
    const PI = 3.14159;
    
    PI = 3.14; // ERROR!
    

    نمادهای خارجی (External Symbols)

    از کلیدواژه extern برای اعلان نمادهایی که در کتابخانه‌های خارجی یا واحدهای ترجمه دیگر تعریف شده‌اند استفاده کنید. این اعلان‌ها شامل مقداردهنده اولیه نیستند.

    extern errno: int; // private external symbol
    
    pub extern stdin: void*; // public external symbol
    

    متغیرهای محلی

    متغیرهای محلی درون بدنه توابع با استفاده از var یا const اعلان می‌شوند. scope آنها به بلوکی که در آن تعریف شده‌اند محدود می‌شود.

    pub fn main() {
        var name = "Cyrus"; // mutable local
    
        const timeout_ms = 500; // immutable local
    }
    

    اگر نیاز به اطمینان از یک نوع خاص دارید، می‌توانید اعلان را حاشیه‌نویسی کنید:

    pub fn main() {
        const epsilon: float64 = 0.001;
    
        var retries: int;
    }
    

    مقداردهی اولیه صفر (Zero Initialization)

    در کوروش، هر متغیری که بدون مقدار اولیه صریح اعلان شود، به طور خودکار با صفر مقداردهی اولیه می‌شود.

    pub fn main() {
        var x: int; // initialized to 0
        var y: float64; // initialized to 0.0
        var z: void*; // initialized to (nil)
    
        printf("%d\n", x);
    }
    

    عدم استنتاج نوع دیرهنگام

    کوروش استنتاج نوع دیرهنگام را 허용 نمی‌کند. هر متغیر باید نوع خود را در نقطه اعلان مشخص داشته باشد، یا:

    • از طریق یک مقداردهنده اولیه (عبارت دارای نوع مشخصی است)
    • از طریق یک حاشیه‌نویسی نوع صریح

    اعلان یک متغیر بدون نوع و بدون مقداردهنده اولیه مجاز نیست، حتی اگر بعداً به آن مقدار تخصیص دهید:

    var x; // ERROR!
    
    x = 10;
    

    شما باید یا بنویسید:

    var x = 10; // type inferred as int
    

    یا:

    var x: int; // explicit type, zero-initialized to 0
    
    x = 10;