Rust: المُشغِّلات والتعبيرات في لغة Rust
آخر تحديث: 2026-08-26
في لغة Rust، يُعتبر كل شيء تقريبًا تعبيرًا — بما في ذلك
ifوmatch.
يُعد فهم الفرق بين التعبيرات (التي تُرجع قيمة) والجمل (التي لا تُرجع قيمة) أمرًا أساسيًّا لكتابة كود موجز بلغة Rust.
1. ما ستتعلمه
- العوامل الحسابية:
+ - * / % - عوامل المقارنة:
== != < > <= >= - العوامل المنطقية:
&& || ! - عوامل التشغيل البتية:
& | ^ << >> - الفرق بين التعبيرات والجمل
- أولوية العمليات الحسابية
2. قصة أمين الصندوق
(1) الإحباط: أرتكب أخطاء دائمًا عند حساب الخصومات
توم هو مدير متجر ملابس، ويضطر كل يوم إلى حساب خصومات متنوعة:
- اشترِ منتجين واحصل على خصم 20٪؛ اشترِ ثلاثة منتجات واحصل على خصم 30٪
- وفر 50 عند الطلبات التي تبلغ قيمتها 500 أو أكثر
- يحصل الأعضاء على خصم إضافي بنسبة 5٪
- أخطأت في ترتيب الجمع بين الخصومات، مما أدى إلى عدم توازن الحسابات في نهاية الشهر، ونتج عن ذلك خسارة قدرها 500 يوان.
«سيكون من الرائع لو كانت هناك آلة حاسبة قادرة على إجراء العمليات الحسابية تلقائيًّا بالترتيب الصحيح...»
(2) نظام التعبيرات في لغة 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. قائمة العوامل
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.
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، تحدد الفاصلة المنقوطة ما إذا كان الشيء تعبيرًا أم جملةً:
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) تعبيرات الكتل
{} يمكن أن يكون كتلة التعليمات البرمجية الموجودة داخل الكتلة عبارة عن تعبير؛ وإذا لم تنتهِ السطر الأخير بفاصلة منقوطة، فإنها تُرجع قيمةً:
let result = {
let a = 2;
let b = 3;
a * b // No semicolons, This expression returns 6
};
5. أمثلة على العوامل الحسابية
(1) ▶ المثال:العمليات الحسابية والأنواع (مستوى الصعوبة ⭐)
// ============================================
// 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);
}
الناتج:
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) ▶ المثال:التقييم المباشر للعمليات المنطقية (مستوى الصعوبة: ⭐⭐)
// ============================================
// 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
}
الناتج:
Available for purchase (&&): false
(|| Short Circuit, The right side will not be executed): true
يُعد تقييم الدائرة القصيرة إحدى طرق تحسين الأداء المهمة — حيث يتم وضع عمليات الفحص منخفضة التكلفة في الجزء الأيسر وعمليات الفحص عالية التكلفة في الجزء الأيمن لتجنب الحسابات غير الضرورية.
(3) ▶ المثال:قيم الإرجاع لكتلة التعبيرات (مستوى الصعوبة ⭐⭐)
// ============================================
// 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);
}
الناتج:
Score: 85, Level: B
Result: passed
لا تحتوي لغة Rust على عامل ثلاثي (
condition ? a : b)، لكنifيُعد تعبيرًا بحد ذاته ويمكنه تحقيق النتيجة نفسها مع قابلية قراءة أفضل.
(4) ▶ المثال:العمليات البتية في التطبيق العملي — علامات الأذونات ومزج الألوان (مستوى الصعوبة ⭐⭐)
// ============================================
// 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);
}
الناتج:
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) ▶ المثال:أولوية العمليات الحسابية والتعبيرات المركبة (مستوى الصعوبة ⭐⭐⭐)
// ============================================
// 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);
}
الناتج:
=== 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
أولوية العوامل الحسابية، من الأعلى إلى الأدنى:
* / %→+ -→ عوامل المقارنة →&&→||. في حالة الشك، استخدم الأقواس؛ فقابلية قراءة الكود أهم من «الإيجاز».
❓ أسئلة شائعة
as؟as باقتطاع البيانات دون الإبلاغ عن أي خطأ.📖 ملخص
- توجد في لغة Rust أربعة أنواع من العوامل الحسابية: الحسابية، والمقارنة، والمنطقية، والبتية؛ ومعظمها يتوافق مع تلك الموجودة في اللغات الأخرى.
- يؤدي القسمة بين الأعداد الصحيحة إلى اقتطاع؛ استخدم
asللتحويل إلى قسمة ذات فاصلة عائمة - تُظهر العوامل المنطقية
&&و||سلوك التقييم السريع - التعبيرات لها قيم إرجاع، في حين أن الجمل ليس لها قيم إرجاع — والفاصلة المنقوطة هي ما يصنع الفارق.
ifهو تعبير بحد ذاته ويمكن استخدامه كبديل للمُشغِّل الثلاثي في لغات البرمجة الأخرى لا يتوفر في Rust++/--، استخدم+= 1/-= 1بدلاً من ذلك.
📝 تمارين
- الصعوبة ⭐: اكتب برنامجًا يستخدم عملية التحويل
asلتحويلi32من النوع5و2إلىf64، ويُخرج5 / 2 = 2.5. - الصعوبة ⭐⭐: حدد متغيرًا
x = 5، واستخدم كتلة تعبير{ x + 1 }لتعيين قيمة لـy، وحدد ما إذا كانxلا يزال يمكن الوصول إليه خارج كتلة التعبير. - الصعوبة ⭐⭐⭐: قم بتنفيذ دالة
fn is_even(n: i32) -> boolباستخدام عوامل التشغيل البتية، حيث يجب عليك استخدام&من العمليات البتية (وليس%) لتحديد التماثل.