صفحة الصنف Numeric في روبي

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث

الصنف Numeric هو الصنف الذي يجب أن ترثه كل الأصناف العددية عالية المستوى.

يسمح الصنف Numeric بتحديد التخزين heap-allocated objects للكائنات. الأصناف العددية الأساسية الأخرى، مثل Integer، تُنزّل كأصناف آنية، والذي يعني أنّ كل عدد صحيح هو كائن غير قابل للتغيير (immutable)، والذي بُمرر دائمًا بقيمته.

a = 1
1.object_id == a.object_id   #=> true

وهكذا لا يمكن أن يكون هناك إلا نسخة (instance) واحدة فقط من العدد الصحيح 1. تضمن روبي هذا عن طريق منع إنشاء نسخ جديدة ومنع التكرار.

Integer.new(1)   #=> NoMethodError: undefined method `new' for Integer:Class
1.dup            #=> TypeError: can't dup Integer

لهذا السبب، يجب استخدام الصنف Numeric عند تعريف أصناف عددية أخرى.

يجب أن تقوم الأصناف التي ترث من Numeric بتنزيل (implement) التابع coerce، والذي يعيد مصفوفة ثنائية تحتوي على كائن مُحوّل (coerced) إلى نسخة من الصنف الجديد والكائن self (انظر coerce).

يجب أيضا على الأصناف الوراثة بتنزيل توابع العمليات الحسابية (+ ، - ، * و /) والمعامل <=> (انظر الصنف Comparable). قد تعتمد هذه التوابع على coerce لضمان إمكانية التداخل (interoperability) مع نسخ الأصناف العددية الأخرى.

class Tally < Numeric
  def initialize(string)
    @string = string
  end

  def to_s
    @string
  end

  def to_i
    @string.size
  end

  def coerce(other)
    [self.class.new('|' * other.to_i), self]
  end

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

  def +(other)
    self.class.new('|' * (to_i + other.to_i))
  end

  def -(other)
    self.class.new('|' * (to_i - other.to_i))
  end

  def *(other)
    self.class.new('|' * (to_i * other.to_i))
  end

  def /(other)
    self.class.new('|' * (to_i / other.to_i))
  end
end

tally = Tally.new('||')
puts tally * 2            #=> "||||"
puts tally > 1            #=> true

توابع النسخ العامة (Public Instance Methods)

التابع %

يعيد x.modulo(y)‎ ناتج التعبير x-y*(x/y).floor.

التابع +@

علامة الإضافة الأحادية (Unary Plus)

التابع -@

علامة ناقص الأحادية (Unary Minus)

التابع <=>

يعيد القيمة صفر إن كان number يساوي other، وإلا فسيُعيد nil.

التابع abs

يعيد القيمة المطلقة لـ num.

التابع abs2

يعيد مربع العدد الذي استُدعي معه.

التابع angle

يعيد القيمة 0 إن كانت القيمة موجبة، أو pi خلاف ذلك.

التابع arg

يعيد القيمة 0 إن كانت القيمة موجبة، أو pi خلاف ذلك.

التابع ceil

يعيد التابع ceil أصغر عدد من الأعداد الأكبر من أو تساوي العدد الذي استُدعي معه بدقة ndigits موضعا عشريًا (القيمة الافتراضية هي 0).

التابع clone

يعيد الكائن الذي استُدعي معه.

التابع coerce

إن كان numeric من نفس نوع num، فستُعاد مصفوفة [numeric, num]. خلاف ذلك، ستٌعاد مصفوفة مع numeric و num ممثلين كعددين عشريين (Float).

التابع conj

يعيد الكائن self.

التابع conjugate

يعيد الكائن self.

التابع denominator

يعيد المقام (denominator)، ويكون دائمًا موجبًا.

التابع div

يستخدم العملية / لإجراء القسمة، ثم يحوّل النتيجة إلى عدد صحيح.

التابع divmod

يعيد التابع divmod مصفوفة تحتوي على الحاصل (quotient) والباقي الناتج عن قسمة العدد الذي استُدعي معه على الوسيط المعطى numeric.

التابع dup

يعيد الكائن الذي استُدعي معه.

التابع eql?‎

يعيد القيمة true إن كان num و numeric من نفس النوع وكانت قيممهما متساوية.

التابع fdiv

يعيد ناتج القسمة العشرية.

التابع finite?

يعيد القيمة true إن كان num عددًا منتهيًا (finite)، وإلا فسيعيد false.

التابع floor

يعيد التابع floor أكبر عدد من الأعداد الأصغر من أو تساوي العدد الذي استُدعي معه بدقة ndigits منزلا عشريًا (القيمة الافتراضية هي 0).

التابع i

يعيد العدد التخيلي (imaginary number) المقابل. غير متوفر للأعداد العقدية.

التابع imag

يعيد الصفر.

التابع imaginary

يعيد الصفر.

التابع infinite?‎

يعيد القيمة nil أو ‎-1 أو 1 اعتمادًا على ما إن كانت القيمة منتهية (finite) أو تساوي ‎-Infinity أو ‎+Infinity.

التابع integer?‎

يعيد true إن كان num من النوع Integer.

التابع magnitude

يعيد القيمة المطلقة لـ num.

التابع modulo

يعيد x.modulo(y)‎ ناتج التعبير x-y*(x/y).floor.

التابع negative?

يعيد true إن كان num أصغر من 0.

التابع nonzero?

يعيد self إن كان num يخالف الصفر، أو nil خلاف ذلك.

التابع numerator

يعيد البسط (numerator).

التابع phase

يعيد القيمة 0 إن كانت القيمة موجبة ، أو pi خلاف ذلك.

التابع polar

يعيد المصفوفة [num.abs، num.arg].

التابع positive?

يعيد true إن كان num أكبر من 0.

التابع quo

يعيد التابع quo ناتج القسمة الأكثر دقة (فيمة جذرية [rational] للأعداد الصحيحة ، وقيمة غشرية [floats] للأعداد العشرية).

التابع real

يعيد الكائن نفسه (self).

التابع real?‎

يعيد القيمة true إن كان num عددًا حقيقيا (أي ليس Complex).

التابع rect

يعيد المصفوفة[num, 0].

التابع rectangular

يعيد المصفوفة [num, 0].

التابع remainder

x.remainder(y)‎ يكافئ x-y*(x/y).truncate.

التابع round

يعيد التابع round العدد الذي استُدعي معه مُقرّبًا إلى أقرب قيمة بدقة ndigits منزلًا عشريًا (القيمة الافتراضية هي 0).

التابع step

يستدعي التابع step الكتلة المعطاة مع تمرير سلسلة من الأعداد إليها بدءًا من العدد الذي استُدعي معه (num)، ويصعد بالخطوة step (قيمتها الافتراضية1) في كل استدعاء.

التابع to_c

يعيد القيمة كعدد عقدي.

التابع to_int

يستدعي التابع to_i الخاص بالصنف الفرعي (child class) لتحويل العدد num إلى عدد صحيح.

التابع truncate

يعيد التابع truncate العدد الذي استُدعي معه مُقتطعًا (نحو الصفر) بدقة ndigits (انظر فقرة البنية العامة) منزلًا عشريًا (القيمة الافتراضية هي 0).

التابع zero?‎

يعيد القيمة true إن كانت num قيمة هي الصفر.

مصادر