ال

النطاقات في Ruby

1 تمرين

نبذة عن النطاقات

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

1..5  # => 1..5
1...5 # => 1...5

(1..5).to_a # => [1, 2, 3, 4, 5]
(1...5).to_a # => [1, 2, 3, 4]

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

يمكن أيضًا إنشاء المدى باستخدام باني Range.

Range.new(1, 5) # A range containing 1, 2, 3, 4, 5
Note

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

(1..5).sum # => 15
1..5.sum # => Error: undefined method `sum' for 5:Integer (NoMethodError)

الحصول على السلاسل النصية الفرعية

عندما تريد تقطيع سلسلة نصية، يمكنك استخدام عامل المدى للحصول على سلسلة نصية فرعية. أي بإنشاء مدى بفهرسي البداية والنهاية للسلسلة الفرعية.

"Hello World"[0..4] # => "Hello"
"Hello World"[6..10] # => "World"

يمكنك أيضًا استخدام فهارس سالبة للحصول على السلسلة الفرعية من نهاية السلسلة النصية.

"Hello World"[-5..-1] # => "World"
"Hello World"[6..-4] # => "Wo"

طرق المدى

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

الطريقة الوصف مثال
sum تُرجع مجموع كل القيم في المدى (1..5).sum # => 15
size تُرجع حجم المدى (1..5).size # => 5
include? تُرجع true إذا كان المدى يضم القيمة المعطاة، وإلا false (1..5).include?(3) # => true

المدى اللانهائي والمدى بلا بداية

يمكن أن يكون المدى لانهائيًا أو بلا بداية. في المدى اللانهائي أو المدى بلا بداية تكون قيمة البداية أو النهاية nil، ولكن يمكن حذف nil عند تعريف المدى.

يكون استخدام المدى بلا بداية أو المدى اللانهائي مفيدًا عندما تريد، مثلًا، تقطيع سلسلة نصية من البداية أو إلى النهاية.

"Hello World"[0..] # => "Hello World"
"Hello World"[4..] # => "o World"
"Hello World"[..5] # => "Hello "
Caution

إذا لم يُستخدم على مجموعة، فقد يتسبب المدى اللانهائي في تسلسل لا نهائي، إن لم يُستخدم بحذر.

المدى مع السلاسل النصية

يمكن أيضًا استخدام السلاسل النصية في المدى، ما يتيح الحصول على فترة من السلاسل النصية بين سلسلتين. وقد يكون سلوكه غير متوقع بعض الشيء مع سلاسل نصية معينة، لذا استخدمه بحذر.

"aa".."az".to_a # => ["aa", "ab", "ac", ..., "az"]

كائنات مخصصة في المدى

Advanced

تتيح لك Ruby استخدام كائنات مخصصة في المدى. والشرط في ذلك أن يُنفّذ الكائن ما يلي:

  • تضمين الوحدة Comparable
  • طريقة succ
  • طريقة <=>

تتيح هذه الطرق للمدى أن يمرّ على الكائن ويقارن الكائنات داخله.

class Foo
  include Comparable

  attr_reader :value

  def initialize(value)
    @value = value
  end

  def succ
    Foo.new(value + 1)
  end

  def <=>(other)
    value <=> other.value
  end
end

(Foo.new(1)..Foo.new(5))
# => #<Foo:0x7f3552bebe70 @value=1>, #<Foo:0x7f3552bebe50 @value=2>, #<Foo:0x7f3552bebe40 @value=3>, #<Foo:0x7f3552bebe30 @value=4>, #<Foo:0x7f3552bebe20 @value=5>
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة

تعلّم النطاقات