الفرق بين المراجعتين لصفحة: «Ruby/Numeric»

من موسوعة حسوب
أنشأ الصفحة ب' ==توابع الصنف العامة (Public Class Methods)== === التابع %=== يكافئ <code>x.modulo(y)</code> التعبير <code>x-y*(x...'
 
لا ملخص تعديل
سطر 1: سطر 1:
الصنف <code>Numeric</code> هو الصنف الذي يجب أن ترثه كل الأصناف العددية عالية المستوى.
يسمح الصنف <code>Numeric</code> بتحديد التخزين heap-allocated objects للكائنات. الأصناف العددية الأساسية الأخرى، مثل <code>Integer</code>، تُنزّل كأصناف آنية، والذي يعني أنّ كل عدد صحيح هو كائن غير قابل للتغيير (immutable)، والذي بُمرر دائمًا بقيمته.<syntaxhighlight lang="ruby">
a = 1
1.object_id == a.object_id  #=> true
</syntaxhighlight>وهكذا لا يمكن أن يكون هناك إلا نسخة (instance) واحدة فقط من العدد الصحيح <code>1</code>.  تضمن روبي هذا عن طريق منع إنشاء نسخ جديدة ومنع التكرار.<syntaxhighlight lang="ruby">
Integer.new(1)  #=> NoMethodError: undefined method `new' for Integer:Class
1.dup            #=> TypeError: can't dup Integer
</syntaxhighlight>لهذا السبب، يجب استخدام الصنف <code>Numeric</code> عند تعريف أصناف عددية أخرى.
يجب أن تقوم الأصناف التي ترث من <code>Numeric</code> بتنزيل (implement) التابع <code>coerce</code>، والذي يعيد مصفوفة ثنائية تحتوي على كائن مُحوّل (coerced) إلى نسخة من الصنف الجديد والكائن self (انظر <code>[[Ruby/Numeric/coerce|coerce]]</code>).
يجب أيضا على الأصناف الوراثة بتنزيل توابع العمليات الحسابية (<code>+</code> ، <code>-</code> ، <code>*</code> و <code>/</code>) والمعامل <code><=></code>  (انظر الصنف <code>[[Ruby/Comparable|Comparable]]</code>). قد تعتمد هذه التوابع على <code>[[Ruby/Numeric/coerce|coerce]]</code> لضمان إمكانية التداخل (interoperability) مع نسخ الأصناف العددية الأخرى.<syntaxhighlight lang="ruby">
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
</syntaxhighlight>


==توابع الصنف العامة (Public Class Methods)==
==توابع الصنف العامة (Public Class Methods)==

مراجعة 00:28، 28 أكتوبر 2018

الصنف 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 Class Methods)

التابع %

يكافئ x.modulo(y) التعبير x-y*(x/y).floor.

التابع +@

علامة الإضافة الأحادية (Unary Plus) - تعيد المُستقبِل.

التابع -@

علامة ناقص الأحادية (Unary Minus) - تعيد المستقبِل (receiver) منفيًا.

التابع <=>

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

التابع abs

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

التابع abs2

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

التابع angle

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

التابع arg

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

التابع ceil

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

التابع clone

يعيد الكائن الذي استُدعي معه. freeze لا يمكن أن تساوي false .

التابع coerce

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

التابع conj

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

التابع conjugate

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

التابع denominator

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

التابع div

يستخدم العملية / لإجراء القسمة، ثم يحوّل النتيجة إلى عدد صحيح. لا يعرفق Numeric العملية /؛ فهذا يُترك للأصناف الفرعية.

التابع divmod

يعيد مصفوفة تحتوي على الحاصل (quotient) والباقي المتحصل عليه بقسمة num على numeric.

التابع dup

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

التابع eql?

يعيد القيمة true إن كان num و numeric من نفس النوع وكانت قيممهما متساوية. على خلاف Numeric#==، الذي ينفذ تحويلات النوع.

التابع fdiv

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

التابع finite?

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

التابع floor

يعيد أكبر عدد من الأعداد الأصغر من أو تساوي num بدقة 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

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

التابع real

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

التابع real?

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

التابع rect

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

التابع rectangular

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

التابع remainder

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

التابع round

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

التابع step

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

التابع to_c

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

التابع to_int

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

التابع truncate

يعيد العدد num مُقتطعًا (نحو الصفر) إلى دقة ndigits منزلًا عشريًا (القيمة الافتراضية هي 0).

التابع zero?

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


مصادر