الحلقة بنية تحكم تسمح بتنفيذ الكود بشكل متكرر بناءً على شرط معيّن.
while
while حلقة هي بنية تحكم تسمح بتنفيذ الكود بشكل متكرر بناءً على شرط معيّن.
يستمر الكود داخل حلقة while في التنفيذ ما دام الشرط يُقيَّم على أنه صحيح.
غالبًا ما تُستخدم حلقات while عندما يكون عدد التكرارات غير معروف مسبقًا، ويمكن استخدامها في أي حالة تحتاج فيها إلى حلقة.
يُقيَّم الشرط قبل تنفيذ الكود داخل الحلقة، وهذا يعني أنه إذا كان الشرط خطأ، فلن يُنفَّذ الكود داخل الحلقة أبدًا.
i = 0
while i < 3
puts i
i += 1
end
# Output:
# 0
# 1
# 2
عندما تريد المرور على سلسلة نصية، يمكنك استخدام حلقة تمر على طول السلسلة النصية.
str = "Hello"
i = 0
while i < str.size
puts str[i]
i += 1
end
# Output:
# H
# e
# l
# l
# o
until
تعمل حلقات until بالطريقة نفسها التي تعمل بها حلقات while، إلا أن الكود داخل الحلقة يستمر في التنفيذ حتى يُقيَّم الشرط على أنه صحيح.
وهو الفرق نفسه بين if و unless.
i = 0
until i == 3
puts i
i += 1
end
من الأخطاء الشائعة في حلقات while الدخول في «حلقة لانهائية» لا تنتهي أبدًا.
قد تنشأ الحلقة اللانهائية عن شرط لا يُقيَّم أبدًا على أنه صحيح ولا خطأ.
وغالبًا ما يكون السبب خطأ من المبرمج، مثل نسيان زيادة متغير الحلقة.
لكن في بعض الأحيان تكون الحلقة اللانهائية أوضح أسلوب لتنفيذ منطق البرنامج.
أو يكون التكرار إلى الأبد أمرًا ضروريًا؛ فعلى سبيل المثال، ينتظر خادم HTTP اتصالًا واردًا، ويعالجه، ثم ينتظر الاتصال التالي.
يمكن استخدام الكلمة المفتاحية break للخروج من الحلقة مبكرًا.
قد يكون ذلك مناسبًا عندما تريد الخروج من الحلقة مبكرًا في ظروف معيّنة.
i = 0
while i <= 3
puts i
i += 1
if i == 2
break
end
end
# Output:
# 0
# 1
يمكن استخدام الكلمة المفتاحية next للانتقال إلى التكرار التالي في الحلقة.
قد يكون ذلك مناسبًا عندما تريد تخطي تكرارات معيّنة في الحلقة.
i = 0
while i <= 3
i += 1
if i == 2
next
end
puts i
end
# Output:
# 1
# 3
قد يختلف نوع المتغير أثناء التكرار.
في المثال التالي، نوع a هو Int32 | String لأنه قد يكون Int32 أو String في الجزء الأول من الحلقة.
لن يحمل المتغير a النوع Int32 | String إلا في الجزء الأول من الحلقة، لأنه عند بدء الحلقة يحمل Int32، وفي التكرار الثاني يحمل String.
سيُشرح نظام الأنواع المتعددة هذا بالتفصيل لاحقًا.
ولكن بما أننا متأكدون من أن الجزء الثاني من الحلقة سيحمل String فقط، فإن نوع a هو String في الجزء الثاني من الحلقة.
وعند التنفيذ، لن يحمل Int32 و String في الوقت نفسه أبدًا.
i = 0
a = 4
while i < 3
p typeof(a)
# => Int32 | String
a = "4"
p typeof(a)
# => String
i += 1
end
في Crystal، يُرجع التعبير الأخير في الطريقة قيمته.
لكنك تحتاج أحيانًا إلى إرجاع قيمة قبل التعبير الأخير.
ولهذا، يمكنك استخدام الكلمة المفتاحية return، التي تُرجع قيمة التعبير التالي.
لن يُنفَّذ الكود المكتوب بعد الكلمة المفتاحية return.
def speed_limit(road_number)
if road_number == 1
return 50
puts "This will not be executed"
elsif road_number == 2
return 80
puts "This will not be executed"
end
100
end
p speed_limit(1) # => 50
p speed_limit(2) # => 80
p speed_limit(3) # => 100
ينبغي حذف الكلمة المفتاحية return عندما يكون التعبير الأخير في الطريقة هو القيمة التي ينبغي إرجاعها.
في هذا التمرين ستتعامل مع حسابات التوفير. في كل عام، يُحدَّث رصيد حساب التوفير الخاص بك بناءً على معدل الفائدة الخاص به. يعتمد معدل الفائدة الذي يمنحك إياه البنك على مقدار المال الموجود في حسابك (أي رصيده):
1000 دولار.1000 دولار وأقل من 5000 دولار.5000 دولار.لديك أربع مهام، تتعامل كل واحدة منها مع رصيدك ومعدل الفائدة الخاص به.
نفّذ الطريقة SavingsAccount.interest_rate() التي تأخذ رصيدًا كوسيط.
ينبغي أن تُرجع الطريقة معدل الفائدة للرصيد المعطى.
SavingsAccount.interest_rate(200.75)
# => 0.5
نفّذ الطريقة SavingsAccount.interest() التي تأخذ رصيدًا كوسيط.
ينبغي أن تُرجع الطريقة الفائدة للرصيد المعطى.
SavingsAccount.interest(200.75)
# => 1.00375
نفّذ الطريقة SavingsAccount.annual_balance_update() التي تأخذ رصيدًا كوسيط.
ينبغي أن تُرجع الطريقة الرصيد بعد سنة واحدة.
SavingsAccount.annual_balance_update(200.75)
# => 201.75375
نفّذ الطريقة SavingsAccount.years_before_desired_balance() التي تأخذ رصيدًا ورصيدًا مستهدفًا كوسيطين.
ينبغي أن تُرجع الطريقة عدد السنوات اللازمة للوصول إلى الرصيد المستهدف.
balance = 200.75
target_balance = 214.88
SavingsAccount.years_before_desired_balance(balance, target_balance)
# => 14
عند تطبيق الفائدة البسيطة على رصيد أصلي، يُضرب الرصيد في معدل الفائدة، ويكون حاصل ضرب الاثنين هو مقدار الفائدة.
أما الفائدة المركبة فتُطبَّق على أساس متكرر. في كل مرة يُحسب مقدار الفائدة ويُضاف إلى الرصيد الأصلي، بحيث تخضع حسابات الفائدة اللاحقة لرصيد أصلي أكبر.
سجّل في Exercism لتتعلّم وتتقن Crystal عبر 26 مفهومًا142 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.