الصنف Range في روبي

من موسوعة حسوب
مراجعة 07:10، 3 ديسمبر 2018 بواسطة جميل-بيلوني (نقاش | مساهمات) (مراجعة وتدقيق.)
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)

يمثل الصنف Range مجالًا (مجموعة) من القيم لها بداية ونهاية.

يمكن إنشاء المجالات باستخدام الصياغة الحرفية بالشكل s..e و s...e ، أو باستخدام التابع الباني new. المجالات المُنشأة باستخدام الصياغة .. تشمل عنصري البداية والنهاية. أما تلك المُنشأة باستخدام الصياغة ... فلن تشمل قيمة النهاية. عند استخدامها كمكرر (iterator)، ستعيد المجالات كل قيمها بالتتابع.

(-1..-5).to_a      #=> []
(-5..-1).to_a      #=> [-5, -4, -3, -2, -1]
('a'..'e').to_a    #=> ["a", "b", "c", "d", "e"]
('a'...'e').to_a   #=> ["a", "b", "c", "d"]

تخصيص المجالات

يمكن إنشاء المجالات باستخدام أيٍّ من الكائنات التي يمكن المقارنة بينها باستخدام المعامل <=>. تتوقع التوابع التي تتعامل مع المجالات كتسلسلات (مثل التابع each والتوابع الموروثة من Enumerable) أن يقدم كائن بداية المجال تابعًا يُسمى succ يعيد الكائن التالي. يتطلب التابعان step و include‎?‎ من عنصر بداية المجال تقديم التابع succ، أو أن يكون قيمة عددية.

في الصنف Xs، أدناه قُدِّم كلّ من المعاملين <=> و succ حتى يُستخدم Xs لبناء المجالات. لاحظ أنه تم تضمين الوحدة Comparable حتى يتم تعريف المعامل == بالتوافق مع المعامل <=>.

class Xs                # represent a string of 'x's
  include Comparable
  attr :length
  def initialize(n)
    @length = n
  end
  def succ
    Xs.new(@length + 1)
  end
  def <=>(other)
    @length <=> other.length
  end
  def to_s
    sprintf "%2d #{inspect}", @length
  end
  def inspect
    'x' * @length
  end
end

الشيفرة التالية هي مثال على استخدام الصنف Xs لإنشاء مجال:

r = Xs.new(3)..Xs.new(6)   #=> xxx..xxxxxx
r.to_a                     #=> [xxx, xxxx, xxxxx, xxxxxx]
r.member?(Xs.new(5))       #=> true

توابع الصنف العامة

new

ينشئ مجالًا من قيمتين تمثِّل إحداها بداية المجال والأخرى نهايته.

توابع النسخة العامة

==

يتحقق من تساوي مجالين مع بعضهما بعضًا.

===

يعيد القيمة true إن كانت قيمةٌ أو كائنٌ ما أحد عناصر المجال (أي تقع ضمنه).

begin

يعيد الكائن الذي يحدد بداية المجال.

bsearch

يبحث عن قيمة من المجال تفي بالشرط المعطى.

cover?‎

يتحقق إن كان الكائن المُمرَّر إليه محصورًا بين بداية ونهاية المجال.

each

يُكرر تنفيذ الكتلة المعطاة مع تمرير عناصر المجال إليها بالتتابع.

end

يعيد الكائن الذي يحدد نهاية المجال.

eql?‎

يتحقق من تساوي مجالين.

exclude_end?‎

يتحقق إن كان المجال يستثني قيمته النهائية.

first

يعيد الكائن الأول في المجال، أو يعيد مصفوفة مكونة من أول n عنصر.

hash

يحسب الشيفرة hash للمجال الذي استدعي معه.

include?‎

يتحقق إن كان كائنٌ ما عنصرًا من المجال المعطى.

inspect

يحوّل المجال الذي استُدعي معه إلى شكل قابل للطباعة.

last

يعيد العنصر الأخير في المجال، أو مصفوفة مؤلفة من آخر n عنصر.

max

يعيد أكبر قيمة من المجال المعطى.

member?‎

يتحقق إن كان كائنٌ ما عنصرًا من المجال الذي استُدعي معه.

min

يعيد أصغر قيمة من المجال.

size

يعيد عدد العناصر في المجال.

step

يكرر الكتلة المعطاة ويمرر إليها n عنصرًا من عناصر المجال بالتتابع.

to_s

يحوّل المجال إلى شكل قابل للطباعة.

مصادر