عبارات الحراسة
عمليات إرجاع مبكرة ونظيفة
عبارات الحراسة درس مجاني في Ruby Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Ruby Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Ruby Academy 4 دروس في المجموع.
عمليات الإرجاع المبكر الواضحة
عبارة الحراسة هي فحص في بداية الأسلوب يعيد النتيجة مبكرًا للحالات غير الصالحة أو الخاصة. وتحافظ على منطق التنفيذ الأساسي مسطحًا وسهل القراءة.
def greet(name)
return "Hello, stranger" if name.nil?
"Hello, #{name}"
end
puts greet(nil)
puts greet("Ada")المشكلة: التداخل العميق
من دون عبارات الحراسة، تتراكم عمليات التحقق على شكل كتل if متداخلة. وينتهي العمل الحقيقي مدفونًا في عمق الجهة اليمنى من الشاشة.
def charge(user)
if user
if user[:active]
puts "Charging #{user[:name]}"
end
end
end
charge({ name: "Sam", active: true })الحل: عبارات الحراسة
اعكسوا كل شرط وأعيدوا النتيجة مبكرًا. عندها يبقى المسار المعتاد عند مستوى المسافة البادئة الأساسي، من دون تداخل، ويصبح واضحًا.
def charge(user)
return unless user
return unless user[:active]
puts "Charging #{user[:name]}"
end
charge({ name: "Sam", active: true })return من دون قيمة
تخرج return المجردة من الأسلوب وتنتج nil. استخدموها عندما لا يحتاج المستدعي إلى نتيجة في الحالة المرفوضة.
def log(message)
return if message.nil? || message.empty?
puts "LOG: #{message}"
end
log("")
log("started")إرجاع قيمة
يمكن لعبارة الحراسة أيضًا أن تعيد قيمة مفيدة، مثل قيمة افتراضية مناسبة، بحيث يحصل المستدعون دائمًا على شيء قابل للاستخدام.
def discount(price)
return 0 if price <= 0
price * 0.1
end
puts discount(-5)
puts discount(200)الحراسة باستخدام unless
تُقرأ return unless condition بمعنى «اخرج إذا لم يتحقق هذا المتطلب». وهذه إحدى أكثر الصيغ الاصطلاحية شيوعًا في Ruby.
def withdraw(balance, amount)
return "Insufficient funds" unless balance >= amount
"New balance: #{balance - amount}"
end
puts withdraw(100, 150)
puts withdraw(100, 40)عبارات حراسة متعددة
رتّبوا عدة عبارات حراسة للتحقق من المدخلات واحدةً تلو الأخرى. يعبّر كل سطر عن قاعدة واحدة، مما يجعل الأسلوب موضحًا لنفسه.
def register(name, age)
return "Name required" if name.to_s.empty?
return "Must be 18+" if age < 18
"Registered #{name}"
end
puts register("", 30)
puts register("Lee", 16)
puts register("Lee", 21)الحراسة باستخدام next داخل الحلقات
لا يمكنكم داخل كتلة أو حلقة استخدام return لتخطي تكرار واحد فقط. استخدموا next كعبارة حراسة للانتقال إلى العنصر التالي.
[1, -2, 3, -4].each do |n|
next if n.negative?
puts n
endعبارات الحراسة تحسّن سهولة القراءة
قارنوا ذهنيًا بين الأسلوبين أدناه: تزيل عبارات الحراسة else وتقلل المسافة البادئة. فيرى القارئ معالجة الحالات غير الصالحة أولًا، ثم المنطق الأساسي.
def area(width, height)
return 0 unless width.positive? && height.positive?
width * height
end
puts area(0, 5)
puts area(4, 5)إطلاق استثناء في عبارة حراسة
عندما يكون الإدخال السيئ خطأً برمجيًا وليس حالة متوقعة، أطلقوا استثناءً في عبارة الحراسة للفشل بسرعة وبشكل واضح.
def sqrt(n)
raise ArgumentError, "n must be >= 0" if n.negative?
Math.sqrt(n)
end
puts sqrt(16)
puts sqrt(-1) rescue puts "caught negative input"تجميع المفاهيم
عبارات الحراسة عادة صغيرة ذات فائدة كبيرة:
- عالجوا الحالات الخاصة مقدمًا ثم أعيدوا النتيجة.
- حافظوا على المنطق الأساسي من دون مسافة بادئة إضافية.
- استخدموا
return/next/raiseوفقًا للموقف.
def initials(name)
return "" if name.nil? || name.strip.empty?
name.split.map { |part| part[0].upcase }.join
end
puts initials(" ").inspect
puts initials("grace hopper")تحقق سريع
اختبروا فهمكم لعبارات الحراسة.
مراجعة
لقد تعلمتم عبارات الحراسة:
- أعيدوا النتيجة مبكرًا للحالات غير الصالحة أو الخاصة.
- تخرج
return unlessعندما لا يتحقق أحد المتطلبات. - استخدموا
nextلتخطي تكرار في حلقة، وraiseللأخطاء الحقيقية. - والنتيجة هي أساليب مسطحة تشرح نفسها.
def safe_divide(a, b)
return nil if b.zero?
a / b
end
puts safe_divide(10, 0).inspect
puts safe_divide(10, 2)الأسئلة الشائعة
هل درس «عبارات الحراسة» مجاني؟
نعم — نص درس «عبارات الحراسة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Ruby Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Ruby Academy 4 دروس في المجموع.
ماذا ستتعلم في «عبارات الحراسة»؟
عمليات إرجاع مبكرة ونظيفة تتمرن على Ruby Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Ruby Academy؟
لا تُشترط خبرة سابقة. Ruby Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «عبارات الحراسة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Ruby Academy هذا؟
نعم. كل درس في Ruby Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.