Rust: المُشغِّلات والتعبيرات في لغة Rust

آخر تحديث: 2026-08-26

في لغة Rust، يُعتبر كل شيء تقريبًا تعبيرًا — بما في ذلك if وmatch.

يُعد فهم الفرق بين التعبيرات (التي تُرجع قيمة) والجمل (التي لا تُرجع قيمة) أمرًا أساسيًّا لكتابة كود موجز بلغة Rust.


1. ما ستتعلمه



2. قصة أمين الصندوق

(1) الإحباط: أرتكب أخطاء دائمًا عند حساب الخصومات

توم هو مدير متجر ملابس، ويضطر كل يوم إلى حساب خصومات متنوعة:

«سيكون من الرائع لو كانت هناك آلة حاسبة قادرة على إجراء العمليات الحسابية تلقائيًّا بالترتيب الصحيح...»

(2) نظام التعبيرات في لغة Rust

RUST
fn main() {
    let price: f64 = 299.0;      // A piece of clothing 299 yuan
    let quantity: i32 = 3;        // Bought 3 items
    let is_member: bool = true;   // Is a member

    // Calculate all discounts with a single expression
    let total = (price * quantity as f64)           // Original Price
        * if quantity >= 3 { 0.7 } else { 0.9 }    // Volume Discount
        * if is_member { 0.95 } else { 1.0 };      // Member Discounts

    println!("Original Price: {:.2} yuan", price * quantity as f64);
    println!("Price after discount: {:.2} yuan", total);
    println!("Save: {:.2} yuan", price * quantity as f64 - total);
}

في لغة Rust، يُعد if تعبيرًا بحد ذاته ويمكنه إرجاع قيمة مباشرةً. وهذا يتيح التعبير عن عملية حساب الخصم كسلسلة واحدة من التعبيرات، مما يقلل من احتمال حدوث أخطاء.



3. قائمة العوامل

100%
graph TB
    A[Rust Operators] --> B[Arithmetic: + - * / %]
    A --> C[Comparison: == != < > <= >=]
    A --> D[Logic: && || !]
    A --> E[Bitwise Operations: & | ^ << >>]
    A --> F[Assignment: = += -= *= /=]

(1) العوامل الحسابية

المشغل مثال الوصف
+ a + b إضافة
- a - b الطرح
* a * b الضرب
/ a / b القسمة (اقتطاع الأعداد الصحيحة)
% a % b الباقي
- -a أخذ القيمة السالبة (أحادي)

يؤدي القسمة الصحيحة إلى اقتطاع: 5 / 2 = 2 (وليس 2.5). للحصول على نتيجة ذات عائمة، عليك استخدام نوع عائم: 5.0 / 2.0 = 2.5.

(2) عوامل المقارنة

تُرجع جميع عوامل المقارنة النوع bool: true أو false.

RUST
let a = 10;
let b = 20;
println!("{}", a == b);  // false
println!("{}", a != b);  // true
println!("{}", a < b);   // true

(3) العوامل المنطقية

المشغل الاسم مثال الوصف
&& العوامل المنطقية «AND» a && b تكون النتيجة «صحيح» فقط إذا كان كلاهما «صحيح» (دائرة قصيرة)
` ` «أو» المنطقي
! النفي المنطقي !a عكس

التقييم المبكر: && — إذا كان الطرف الأيسر خطأً، فلا يتم تقييم الطرف الأيمن؛ || — إذا كان الطرف الأيسر صحيحًا، فلا يتم تقييم الطرف الأيمن. ويمكن استخدام هذا في نمط «التحقق قبل الوصول».

(4) عوامل العمليات على البتات

المشغل الاسم مثال الوصف
& «AND» على مستوى البتات a & b يساوي 1 فقط إذا كانت جميع البتات المقابلة تساوي 1
` ` عملية «أو» على مستوى البتات `a
^ عملية XOR على مستوى البتات a ^ b تساوي 1 فقط إذا كانت البتات المقابلة مختلفة
<< الإزاحة إلى اليسار a << n الإزاحة إلى اليسار بمقدار n بت (ما يعادل الضرب في 2^n)
>> الإزاحة إلى اليمين a >> n الإزاحة إلى اليمين بمقدار n بت (ما يعادل القسمة على 2^n)


4. التعبيرات والجمل

(1) الاختلافات الرئيسية

المفهوم التعريف المثال
التعبير له قيمة إرجاع 5 + 3 تُرجع 8، وif true { 1 } else { 0 } تُرجع 1
بيان لا توجد قيمة مرتجعة let x = 5; لا توجد قيمة مرتجعة، fn foo() {} لا توجد قيمة مرتجعة

في لغة Rust، تحدد الفاصلة المنقوطة ما إذا كان الشيء تعبيرًا أم جملةً:

RUST
fn main() {
    let y = {
        let x = 3;
        x + 1       // No semicolons -- This is an expression, Returns 4
    };               // End of semicolon let Statement

    println!("y the value: {}", y);  // 4
}

(2) تعبيرات الكتل

{} يمكن أن يكون كتلة التعليمات البرمجية الموجودة داخل الكتلة عبارة عن تعبير؛ وإذا لم تنتهِ السطر الأخير بفاصلة منقوطة، فإنها تُرجع قيمةً:

RUST
let result = {
    let a = 2;
    let b = 3;
    a * b           // No semicolons, This expression returns 6
};


5. أمثلة على العوامل الحسابية

(1) ▶ المثال:العمليات الحسابية والأنواع (مستوى الصعوبة ⭐)

RUST
// ============================================
// Demonstration of Arithmetic Operators——Note: Truncation in integer division
// ============================================

fn main() {
    let a = 10;
    let b = 3;

    println!("Addition: {} + {} = {}", a, b, a + b);
    println!("Subtraction: {} - {} = {}", a, b, a - b);
    println!("Multiplication: {} * {} = {}", a, b, a * b);
    println!("Integer Division: {} / {} = {} (Truncation)", a, b, a / b);
    println!("Floating-Point Division: {} / {} = {:.2}", a as f64, b as f64, a as f64 / b as f64);
    println!("Modulo: {} % {} = {}", a, b, a % b);
}

الناتج:

TEXT 📖 للعرض فقط
Addition: 10 + 3 = 13
Subtraction: 10 - 3 = 7
Multiplication: 10 * 3 = 30
Integer Division: 10 / 3 = 3 (Truncation)
Floating-Point Division: 10 / 3 = 3.33
Modulo: 10 % 3 = 1

as تُستخدم الكلمات المفتاحية لتحويل الأنواع. a as f64 قم بتحويل العدد الصحيح إلى عدد عائم قبل إجراء عملية القسمة للحصول على نتيجة عائمة.


(2) ▶ المثال:التقييم المباشر للعمليات المنطقية (مستوى الصعوبة: ⭐⭐)

RUST
// ============================================
// Short-Circuit Evaluation of Logical Operators
// ============================================

fn main() {
    let age = 17;
    let has_id = true;

    // && Short Circuit: If the left is false, the right side is not executed
    let can_buy = age >= 18 && has_id;
    println!("Available for purchase (&&): {}", can_buy);  // false (Since the left side is already false)

    // || Short Circuit: If the left is true, the right side is not executed
    let is_ok = true || (expensive_check());
    println!("(|| Short Circuit, The right side will not be executed): {}", is_ok);
}

fn expensive_check() -> bool {
    println!("This function will not be executed!");
    true
}

الناتج:

TEXT 📖 للعرض فقط
Available for purchase (&&): false
(|| Short Circuit, The right side will not be executed): true

يُعد تقييم الدائرة القصيرة إحدى طرق تحسين الأداء المهمة — حيث يتم وضع عمليات الفحص منخفضة التكلفة في الجزء الأيسر وعمليات الفحص عالية التكلفة في الجزء الأيمن لتجنب الحسابات غير الضرورية.


(3) ▶ المثال:قيم الإرجاع لكتلة التعبيرات (مستوى الصعوبة ⭐⭐)

RUST
// ============================================
// Using Expression Blocks to Implement Concise Assignments with Complex Conditions
// ============================================

fn main() {
    let score = 85;

    let grade = {
        if score >= 90 {
            "A"
        } else if score >= 80 {
            "B"
        } else if score >= 70 {
            "C"
        } else if score >= 60 {
            "D"
        } else {
            "F"
        }
    };  // Note: The entire if-else chain is an expression, End with a semicolon let Statement

    println!("Score: {}, Level: {}", score, grade);

    // Alternatives to Ternary Operations: Use if Expression
    let is_pass = if score >= 60 { "passed" } else { "failed" };
    println!("Result: {}", is_pass);
}

الناتج:

TEXT 📖 للعرض فقط
Score: 85, Level: B
Result: passed

لا تحتوي لغة Rust على عامل ثلاثي (condition ? a : b)، لكن if يُعد تعبيرًا بحد ذاته ويمكنه تحقيق النتيجة نفسها مع قابلية قراءة أفضل.


(4) ▶ المثال:العمليات البتية في التطبيق العملي — علامات الأذونات ومزج الألوان (مستوى الصعوبة ⭐⭐)

RUST
// ============================================
// Bitwise Operations in Practice:File Permissions and RGB Color Manipulation
// ============================================

fn main() {
    let read_perm: u8    = 0b100;   // 4
    let write_perm: u8   = 0b010;   // 2
    let exec_perm: u8    = 0b001;   // 1

    let user_perm = read_perm | write_perm;
    println!("User Permissions: {:03b} (Read+Write)", user_perm);

    let full_perm = read_perm | write_perm | exec_perm;
    println!("Full Permissions: {:03b} (Read+Write+Execute)", full_perm);

    let can_read = (user_perm & read_perm) != 0;
    let can_exec = (user_perm & exec_perm) != 0;
    println!("User-readable: {}, Executable: {}", can_read, can_exec);

    let no_write = user_perm & !write_perm;
    println!("Remove Write Permissions: {:03b}", no_write);

    let toggled = user_perm ^ exec_perm;
    println!("Toggle the execution bit: {:03b}", toggled);

    let red: u32   = 0xFF0000;
    let green: u32 = 0x00FF00;
    let blue: u32  = 0x0000FF;
    let yellow = red | green;
    let white = red | green | blue;
    println!("\nRed: {:06X}", red);
    println!("Yellow (Red|Green): {:06X}", yellow);
    println!("White (Red|Green|Blue): {:06X}", white);

    let pixel: u32 = 0xFF8040;
    let r = (pixel >> 16) & 0xFF;
    let g = (pixel >> 8)  & 0xFF;
    let b = pixel & 0xFF;
    println!("\nPixel #FF8040 → R={}, G={}, B={}", r, g, b);

    let shift_val: u8 = 1;
    println!("\n1 << 0 = {}", shift_val << 0);
    println!("1 << 1 = {}", shift_val << 1);
    println!("1 << 2 = {}", shift_val << 2);
    println!("1 << 3 = {}", shift_val << 3);
}

الناتج:

TEXT 📖 للعرض فقط
User Permissions: 110 (Read+Write)
Full Permissions: 111 (Read+Write+Execute)
User-readable: true, Executable: false
Remove Write Permissions: 100
Toggle the execution bit: 111

Red: FF0000
Yellow (Red|Green): FFFF00
White (Red|Green|Blue): FFFFFF

Pixel #FF8040 → R=255, G=128, B=64

1 << 0 = 1
1 << 1 = 2
1 << 2 = 4
1 << 3 = 8

تُعد العمليات البتية شائعة للغاية في برمجة الأنظمة: لإدارة الأذونات، استخدم | للدمج، و& للتحقق، و& ! للإزالة؛ أما بالنسبة للألوان، فاستخدم | للمزج و>> + & لاستخراج القنوات؛ << تعادل الضرب في قوة من 2.


(5) ▶ المثال:أولوية العمليات الحسابية والتعبيرات المركبة (مستوى الصعوبة ⭐⭐⭐)

RUST
// ============================================
// Operator Precedence in Practice + Compound Assignment Operator
// ============================================

fn main() {
    println!("=== Operator Precedence ===");
    let a = 2 + 3 * 4;
    println!("2 + 3 * 4 = {} (Multiply First, Then Add)", a);

    let b = (2 + 3) * 4;
    println!("(2 + 3) * 4 = {} (Parentheses Take Precedence)", b);

    let c = 10 - 6 / 2;
    println!("10 - 6 / 2 = {} (Multiply First, Then Subtract)", c);

    let d = true && false || true;
    println!("true && false || true = {} (&& Take precedence over ||)", d);

    let e = true || false && false;
    println!("true || false && false = {} (&& Take precedence over ||)", e);

    println!("\n=== Compound Assignment Operator ===");
    let mut score: i32 = 100;
    score += 20;
    println!("score += 20 → {}", score);
    score -= 30;
    println!("score -= 30 → {}", score);
    score *= 2;
    println!("score *= 2 → {}", score);
    score /= 7;
    println!("score /= 7 → {}", score);
    score %= 3;
    println!("score %= 3 → {}", score);

    println!("\n=== Chain Comparison(Using logical operators)===");
    let x = 50;
    let in_range = x >= 0 && x <= 100;
    let out_range = x < 0 || x > 100;
    println!("x={}, in [0,100]: {}, Out of range: {}", x, in_range, out_range);

    let charlie_score = 75;
    let bob_score = 88;
    let both_passed = charlie_score >= 60 && bob_score >= 60;
    let any_excellent = charlie_score >= 90 || bob_score >= 90;
    println!("Both passed: {}, Someone excellent: {}", both_passed, any_excellent);
}

الناتج:

TEXT 📖 للعرض فقط
=== Operator Precedence ===
2 + 3 * 4 = 14 (Multiply First, Then Add)
(2 + 3) * 4 = 20 (Parentheses Take Precedence)
10 - 6 / 2 = 7 (Multiply First, Then Subtract)
true && false || true = true (&& Take precedence over ||)
true || false && false = true (&& Take precedence over ||)

=== Compound Assignment Operator ===
score += 20 → 120
score -= 30 → 90
score *= 2 → 180
score /= 7 → 25
score %= 3 → 1

=== Chain Comparison(Using logical operators)===
x=50, in [0,100]: true, Out of range: false
Both passed: true, Someone excellent: false

أولوية العوامل الحسابية، من الأعلى إلى الأدنى: * / %+ - → عوامل المقارنة → &&||. في حالة الشك، استخدم الأقواس؛ فقابلية قراءة الكود أهم من «الإيجاز».



❓ أسئلة شائعة

س ما قيمة 5 / 2 في لغة Rust؟
ج تساوي 2 (القسمة الصحيحة مع الاقتطاع).
س هل توجد في لغة Rust علامتا ++ و--؟
ج لا.
س ما الفرق بين && و&؟
ج && هي علامة «و» المنطقية (الدائرة القصيرة)، و& هي علامة «و» على مستوى البتات (الدائرة غير القصيرة).
س كيف يمكنني التمييز بين التعبيرات والجمل؟
ج تحقق من وجود فاصلة منقوطة في النهاية.
س ما هي مخاطر تحويل الأنواع باستخدام as؟
ج تقوم as باقتطاع البيانات دون الإبلاغ عن أي خطأ.

📖 ملخص


📝 تمارين

  1. الصعوبة ⭐: اكتب برنامجًا يستخدم عملية التحويل as لتحويل i32 من النوع 5 و2 إلى f64، ويُخرج 5 / 2 = 2.5.
  2. الصعوبة ⭐⭐: حدد متغيرًا x = 5، واستخدم كتلة تعبير { x + 1 } لتعيين قيمة لـ y، وحدد ما إذا كان x لا يزال يمكن الوصول إليه خارج كتلة التعبير.
  3. الصعوبة ⭐⭐⭐: قم بتنفيذ دالة fn is_even(n: i32) -> bool باستخدام عوامل التشغيل البتية، حيث يجب عليك استخدام & من العمليات البتية (وليس %) لتحديد التماثل.
Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%