المدى يمثل فترة بين قيمتين.
أكثر الأنواع شيوعًا التي تدعم المدى هما 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
عند إنشاء مدى في 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 "
إذا لم يُستخدم على مجموعة، فقد يتسبب المدى اللانهائي في تسلسل لا نهائي، إن لم يُستخدم بحذر.
يمكن أيضًا استخدام السلاسل النصية في المدى، ما يتيح الحصول على فترة من السلاسل النصية بين سلسلتين. وقد يكون سلوكه غير متوقع بعض الشيء مع سلاسل نصية معينة، لذا استخدمه بحذر.
"aa".."az".to_a # => ["aa", "ab", "ac", ..., "az"]
تتيح لك 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>