الفرق بين المراجعتين ل"Ruby/Numeric"

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
(أنشأ الصفحة ب' ==توابع الصنف العامة (Public Class Methods)== === التابع %=== يكافئ <code>x.modulo(y)</code> التعبير <code>x-y*(x...')
 
ط (مراجعة وتدقيق.)
 
(مراجعتان متوسطتان بواسطة مستخدم واحد آخر غير معروضتين)
سطر 1: سطر 1:
 +
الصنف <code>Numeric</code> هو الصنف الذي يجب أن ترثه كل الأصناف العددية عالية المستوى.
 +
__TOC__
 +
يسمح الصنف <code>Numeric</code> بتمثيل (instantiation) الكائنات المحجوزة في الكومة (heap-allocated objects). تُنفَّذ الأصناف العددية الأساسية الأخرى، مثل <code>[[Ruby/Integer|Integer]]</code>، كأصناف آنيَّة، أي أنّ كل عدد صحيح هو كائن غير قابل للتغيير (immutable)، والذي يُمرَّر دائمًا بقيمته. اطلع على المثال التالي:<syntaxhighlight lang="ruby">
 +
a = 1
 +
1.object_id == a.object_id  #=> true
  
==توابع الصنف العامة (Public Class Methods)==
+
</syntaxhighlight>لا يمكن أن يكون هناك إلا نسخة (instance) واحدة فقط من العدد الصحيح <code>1</code>. تضمن روبي بهذا منع إنشاء نسخ جديدة ومنع التكرار.<syntaxhighlight lang="ruby">
===[[Ruby/Numeric/25 | التابع %]]===
+
Integer.new(1)   #=> NoMethodError: undefined method `new' for Integer:Class
يكافئ <code>x.modulo(y)</code> التعبير <code>x-y*(x/y).floor</code>.
+
1.dup            #=> TypeError: can't dup Integer
===[[Ruby/Numeric/2B-40 | التابع +@]]===
+
 
علامة الإضافة الأحادية (Unary Plus) - تعيد المُستقبِل.
+
</syntaxhighlight>لهذا السبب، يجب استخدام الصنف <code>Numeric</code> عند تعريف أصناف عددية أخرى.
===[[Ruby/Numeric/2D-40 | التابع -@]]===
+
 
علامة ناقص الأحادية (Unary Minus) - تعيد المستقبِل (receiver) منفيًا.
+
يجب أن تنفِّذ الأصناف التي ترث من الصنف <code>Numeric</code> التابع [[Ruby/Numeric/coerce|<code>coerce</code>]]، والذي يعيد مصفوفة بعنصرين تحتوي على كائن مُحوّل (coerced) إلى نسخة من الصنف الجديد والكائن <code>self</code> (انظر توثيق التابع <code>[[Ruby/Numeric/coerce|coerce]]</code>).
===[[Ruby/Numeric/3C-3D-3E | التابع <=>]]===
+
 
يعيد  القيمة صفر إن كان <code>number</code> يساوي <code>other</code>، وإلا فسيُعيد <code>nil</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">
===[[Ruby/Numeric/abs | التابع abs]]===
+
class Tally < Numeric
يعيد القيمة المطلقة لـ <code>num</code>.
+
  def initialize(string)
===[[Ruby/Numeric/abs2 | التابع abs2]]===
+
    @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 Instance Methods)==
 +
=== [[Ruby/Numeric/mod|<code>modulo</code>]]===
 +
يعيد باقي قسم عدد على آخر.
 +
=== [[Ruby/Numeric/plus|<code>+</code>]]===
 +
يمثِّل المعامل <code>+</code> الأحادي إشارة الزائد التي تسبق العدد لتشير إلى أنه عدد موجب.  
 +
=== [[Ruby/Numeric/minus|<code>-</code>]]===
 +
يمثِّل المعامل <code>-</code> الأحادي إشارة الناقص التي تسبق العدد لتشير إلى أنه عدد سالب.  
 +
=== [[Ruby/Numeric/compar|<code><=></code>]]===
 +
يوازن المعامل <code><=></code> بين عددين ثمَّ يعيد القيمة 0 إن كان هذان العددان متساويين، وإلا فسيُعيد القيمة<code>nil</code>.
 +
===[[Ruby/Numeric/abs |<code>abs</code>]]===
 +
يعيد القيمة المطلقة للعدد الذي استُدعي معه.
 +
===[[Ruby/Numeric/abs2 |<code>abs2</code>]]===
 
يعيد مربع العدد الذي استُدعي معه.
 
يعيد مربع العدد الذي استُدعي معه.
===[[Ruby/Numeric/angle | التابع angle]]===
+
===[[Ruby/Numeric/angle |<code>angle</code>]]===
يعيد القيمة 0 إن كانت القيمة موجبة، أو pi خلاف ذلك.
+
يعيد القيمة <code>0</code> إن كان العدد الذي استُدعي معه موجبًا، أو القيمة <code>[[Ruby/Math/PI|pi]]</code> خلاف ذلك.
===[[Ruby/Numeric/arg | التابع arg]]===
+
===[[Ruby/Numeric/arg |<code>arg</code>]]===
يعيد القيمة 0 إن كانت القيمة موجبة، أو pi خلاف ذلك.
+
يعيد القيمة <code>0</code> إن كان العدد الذي استُدعي معه موجبًا، أو القيمة <code>[[Ruby/Math/PI|pi]]</code> خلاف ذلك.
===[[Ruby/Numeric/ceil | التابع ceil]]===
+
===[[Ruby/Numeric/ceil |<code>ceil</code>]]===
يعيد أصغر عدد أكبر من أو يساوي <code>num</code> بدقة <code>ndigits</code> موضعا عشريًا (القيمة الافتراضية هي 0).
+
يعيد أصغر عدد من الأعداد الأكبر من أو تساوي العدد الذي استُدعي معه وبدقة محدَّدة.
===[[Ruby/Numeric/clone | التابع clone]]===
+
===[[Ruby/Numeric/clone |<code>clone</code>]]===
يعيد الكائن الذي استُدعي معه.  <code>freeze</code> لا يمكن أن تساوي <code>false</code> .
+
يعيد الكائن الذي استُدعي معه.   
===[[Ruby/Numeric/coerce | التابع coerce]]===
+
===[[Ruby/Numeric/coerce |<code>coerce</code>]]===
إن كان <code>numeric</code> من نفس نوع <code>num</code>، فستُعاد مصفوفة <code>[numeric, num]</code>. خلاف ذلك، ستٌعاد مصفوفة مع <code>numeric</code> و <code>num</code> ممثلين كعددين عشريين (<code>Float</code>).
+
إن كان العدد المُمرَّر إلى التابع <code>numeric</code> من نفس نوع العدد الذي استُدعي معه، فسيعيد مصفوفة تحوي هذين العددين. خلاف ذلك، سيحول هذين العددين إلى النوع <code>[[Ruby/Float|Float]]</code> ويعيدهما في مصفوفة.
===[[Ruby/Numeric/conj | التابع conj]]===
+
===[[Ruby/Numeric/conj |<code>conj</code>]]===
يعيد الكائن self.
+
يعيد الكائن الذي استُدعي معه (الكائن <code>self</code>).
===[[Ruby/Numeric/conjugate | التابع conjugate]]===
+
===[[Ruby/Numeric/conjugate |<code>conjugate</code>]]===
يعيد الكائن self.
+
يعيد الكائن الذي استُدعي معه (الكائن <code>self</code>).
===[[Ruby/Numeric/denominator | التابع denominator]]===
+
===[[Ruby/Numeric/denominator |<code>denominator</code>]]===
يعيد  المقام (denominator)، ويكون دائمًا موجبًا.
+
يعيد المقام (denominator) للعدد الكسري الذي استدعي معه، ويكون دائمًا موجبًا.
===[[Ruby/Numeric/div | التابع div]]===
+
===[[Ruby/Numeric/div |<code>div</code>]]===
يستخدم  العملية <code>/</code> لإجراء القسمة، ثم يحوّل النتيجة إلى عدد صحيح. لا يعرفق <code>Numeric</code> العملية <code>/</code>؛ فهذا يُترك للأصناف الفرعية.
+
يستخدم المعامل <code>/</code> لإجراء عملية القسمة على العددين المعطيين، ثم يحوّل النتيجة إلى عدد صحيح.  
===[[Ruby/Numeric/divmod | التابع divmod]]===
+
===[[Ruby/Numeric/divmod |<code>divmod</code>]]===
يعيد مصفوفة تحتوي على الحاصل (quotient) والباقي المتحصل عليه بقسمة <code>num</code> على <code>numeric</code>.
+
يعيد مصفوفة تحتوي على حاصل (quotient) وباقي قسمة العدد الذي استُدعي معه على العدد المُمرَّر إليه.
===[[Ruby/Numeric/dup | التابع dup]]===
+
===[[Ruby/Numeric/dup |<code>dup</code>]]===
يعيد  الكائن الذي استُدعي معه.
+
يعيد الكائن الذي استُدعي معه.
===[[Ruby/Numeric/eql-3F | التابع eql?]]===
+
===[[Ruby/Numeric/eql-3F |<code>eql?‎</code>]]===
يعيد القيمة <code>true</code> إن كان <code>num</code> و <code>numeric</code> من نفس النوع وكانت قيممهما متساوية.  على خلاف Numeric#==، الذي ينفذ تحويلات النوع.
+
يتحقق إن كان العدد الذي استُدعي معه والعدد المُمرَّر إليه من نفس النوع ومتساويين.  
===[[Ruby/Numeric/fdiv | التابع fdiv]]===
+
===[[Ruby/Numeric/fdiv |<code>fdiv</code>]]===
يعيد ناتج القسمة العشرية.
+
يجري عملية القسمة بين العدد الذي استدعي معه والعدد الذي مُرِّر إليه ثم يعيد الناتج في عدد <nowiki/>[[Ruby/Float|عشري]].
===[[Ruby/Numeric/finite-3F | التابع finite?]]===
+
===[[Ruby/Numeric/finite-3F |<code>?finite</code>]]===
يعيد القيمة <code>true</code> إن كان <code>num</code> عددًا منتهيًا (finite)، وإلا فسيعيد <code>false</code>.
+
يتحقق إن كان العدد الذي استُدعي معه عددًا منتهيًا (finite).
===[[Ruby/Numeric/floor | التابع floor]]===
+
===[[Ruby/Numeric/floor |<code>floor</code>]]===
يعيد أكبر عدد من الأعداد الأصغر من أو تساوي <code>num</code> بدقة <code>ndigits</code> من الأرقام العشرية (القيمة الافتراضية هي 0).
+
يعيد أكبر عدد من الأعداد الأصغر من أو تساوي العدد الذي استُدعي معه وبدقة محدَّدة.
===[[Ruby/Numeric/i | التابع i]]===
+
===[[Ruby/Numeric/i |<code>i</code>]]===
يعيد  العدد التخيلي (imaginary number) المقابل. غير متوفر للأعداد العقدية.
+
يعيد [[Ruby/Complex|العدد التخيلي]] (imaginary number) المقابل للعدد الذي استدعي معه.
===[[Ruby/Numeric/imag | التابع imag]]===
+
===[[Ruby/Numeric/imag |<code>imag</code>]]===
يعيد  الصفر.
+
يعيد الصفر.
===[[Ruby/Numeric/imaginary | التابع imaginary]]===
+
===[[Ruby/Numeric/imaginary |<code>imaginary</code>]]===
يعيد  الصفر.
+
يعيد الصفر.
===[[Ruby/Numeric/infinite-3F | التابع infinite?]]===
+
===[[Ruby/Numeric/infinite-3F |<code>infinite?‎</code>]]===
يعيد القيمة <code>nil</code> أو -1 أو 1 اعتمادًا على ما إن كانت القيمة منتهية (finite) أو <code>-Infinity</code> أو <code>+Infinity</code>.
+
يتحقق إذا ما إن كان العدد الذي استدعي معه منتهيًا (finite) أو غير منتهي من الطرف السالب (‎<code>-Infinity</code>) أو غير منتهي من الطرف الموجب (‎<code>+Infinity</code>).
===[[Ruby/Numeric/integer-3F | التابع integer?]]===
+
===[[Ruby/Numeric/integer-3F |<code>integer?‎</code>]]===
يعيد <code>true</code> إن كان <code>num</code> من النوع <code>Integer</code>.
+
يتحقق إن كان العدد الذي استُدعي معه من النوع <code>[[Ruby/Integer|Integer]]</code>.
===[[Ruby/Numeric/magnitude | التابع magnitude]]===
+
===[[Ruby/Numeric/magnitude |<code>magnitude</code>]]===
يعيد القيمة المطلقة لـ <code>num</code>.
+
يعيد القيمة المطلقة للعدد الذي استُدعي معه.
===[[Ruby/Numeric/modulo | التابع modulo]]===
+
===[[Ruby/Numeric/modulo |<code>modulo</code>]]===
<code>x.modulo(y)</code> يكافئ <code>x-y*(x/y).floor</code>.
+
يعيد باقي قسم عدد على آخر.
===[[Ruby/Numeric/negative-3F | التابع negative?]]===
+
===[[Ruby/Numeric/negative-3F |<code>?negative</code>]]===
يعيد <code>true</code> إن كان <code>num</code> أصغر من 0.
+
يتحقق إن كان العدد الذي استُدعي معه عددًا سالبًا.
===[[Ruby/Numeric/nonzero-3F | التابع nonzero?]]===
+
===<code rel="mw:WikiLink" href="Ruby/Numeric/nonzero-3F " title="Ruby/Numeric/nonzero-3F">[[Ruby/Numeric/negative-3F |?]][[Ruby/Numeric/nonzero-3F |nonzero]]</code>===
يعيد <code>self</code> إن كان <code>num</code> يخالف الصفر، أو <code>nil</code> خلاف ذلك.
+
يعيد العدد الذي استُدعي معه إن كان غير صفري، أو يعيد القيمة <code>nil</code> خلاف ذلك.
===[[Ruby/Numeric/numerator | التابع numerator]]===
+
===[[Ruby/Numeric/numerator |<code>numerator</code>]]===
يعيد  البسط (numerator).
+
يعيد البسط (numerator) للعدد الكسري الذي استدعي معه.
===[[Ruby/Numeric/phase | التابع phase]]===
+
===[[Ruby/Numeric/phase |<code>phase</code>]]===
يعيد القيمة 0 إن كانت القيمة موجبة ، أو pi خلاف ذلك.
+
يعيد القيمة <code>0</code> إن كان العدد الذي استُدعي معه موجبًا، أو يعيد القيمة <code>[[Ruby/Math/PI|pi]]</code> خلاف ذلك.
===[[Ruby/Numeric/polar | التابع polar]]===
+
===[[Ruby/Numeric/polar |<code>polar</code>]]===
يعيد المصفوفة [num.abs، num.arg].
+
يعيد المصفوفة <code>[num.abs، num.arg]</code>، إذ <code>num</code> هو العدد الذي استدعي معه.
===[[Ruby/Numeric/positive-3F | التابع positive?]]===
+
===[[Ruby/Numeric/positive-3F |<code>?positive</code>]]===
يعيد <code>true</code> إن كان <code>num</code> أكبر من 0.
+
يتحقق إن كان العدد الذي استُدعي معه عددًا موجبًا.
===[[Ruby/Numeric/quo | التابع quo]]===
+
===[[Ruby/Numeric/quo |<code>quo</code>]]===
يعيد ناتج القسمة الأكثر دقة (جذري [rational] للأعداد الصحيحة ، غشري [floats] للأعداد العشرية).
+
يعيد ناتج القسمة الأكثر دقة (قيمة <nowiki/>[[Ruby/Rational|جذرية]] للأعداد الصحيحة، وقيمة <nowiki/>[[Ruby/Float|عشرية]] للأعداد العشرية).
===[[Ruby/Numeric/real | التابع real]]===
+
===[[Ruby/Numeric/real |<code>real</code>]]===
يعيد الكائن نفسه (self).
+
يعيد العدد الذي استدعي معه (الكائن <code>self</code>).
===[[Ruby/Numeric/real-3F | التابع real?]]===
+
===[[Ruby/Numeric/real-3F |<code>real?‎</code>]]===
يعيد القيمة <code>true</code> إن كان <code>num</code> عددًا حقيقيا (أي ليس <code>Complex</code>).
+
يتحقق إن كان العدد الذي استُدعي معه عددًا حقيقيًّا (أي ليس من النوع <code>[[Ruby/Complex|Complex]]</code>).
===[[Ruby/Numeric/rect | التابع rect]]===
+
===[[Ruby/Numeric/rect |<code>rect</code>]]===
يعيد  المصفوفة[num, 0].
+
يعيد المصفوفة <code>[num, 0]</code> إذ <code>num</code> يمثل العدد الذي استُدعي معه.
===[[Ruby/Numeric/rectangular | التابع rectangular]]===
+
===[[Ruby/Numeric/rectangular |<code>rectangular</code>]]===
يعيد  المصفوفة [num, 0].
+
يعيد المصفوفة <code>[num, 0]</code> إذ <code>num</code> يمثل العدد الذي استُدعي معه.
===[[Ruby/Numeric/remainder | التابع remainder]]===
+
===[[Ruby/Numeric/remainder |<code>remainder</code>]]===
<code>x.remainder(y)</code> يكافئ <code>x-y*(x/y).truncate</code>.
+
يعيد باقي قسم عدد على آخر. أي عندما يُستدعَى التابع بالشكل <code>x.remainder(y)‎</code>، فإنه يماثل الاستدعاء <code>x-y*(x/y).truncate</code>.
===[[Ruby/Numeric/round | التابع round]]===
+
===[[Ruby/Numeric/round |<code>round</code>]]===
يعيد  العدد  <code>num</code> مُقرّبًا إلى أقرب قيمة مع دقة <code>ndigits</code> منزلًا عشريًا (القيمة الافتراضية هي 0).
+
يقرِّب العدد الذي استُدعي معه إلى أقرب قيمة بدقة محدَّدة.
===[[Ruby/Numeric/step | التابع step]]===
+
===[[Ruby/Numeric/step |<code>step</code>]]===
يستدعي  الكتلة المعطاة مع تمرير سلسلة من الأعداد إليها بدءًا من العدد  <code>num</code>، بالخطوة <code>step</code> (قيمتها الافتراضية هي <code>1</code>) في كل استدعاء.
+
يستدعي الكتلة المعطاة مع تمرير سلسلة من الأعداد إليها بدءًا من العدد الذي استُدعي معه وحتى قيمة محدَّدة مع الزيادة أو الطرح بقدار خطوة ثابتة معطاة.
===[[Ruby/Numeric/to_c | التابع to_c]]===
+
===[[Ruby/Numeric/to_c |<code>to_c</code>]]===
يعيد  القيمة كعدد عقدي.
+
يحول العدد الذي استُدعي معه إلى <nowiki/>[[Ruby/Complex|عدد عقدي]].
===[[Ruby/Numeric/to_int | التابع to_int]]===
+
===[[Ruby/Numeric/to_int |<code>to_int</code>]]===
يستدعي  التابع <code>to_i</code> الخاص بالصنف الفرعي (child class) لتحويل العدد <code>num</code> إلى عدد صحيح.
+
يستدعي التابع <code>to_i</code> الخاص بالصنف الفرعي (child class) لتحويل العدد الذي استُدعي معه إلى <nowiki/>[[Ruby/Integer|عدد صحيح]].
===[[Ruby/Numeric/truncate | التابع truncate]]===
+
===[[Ruby/Numeric/truncate |<code>truncate</code>]]===
يعيد  العدد  <code>num</code> مُقتطعًا (نحو الصفر) إلى دقة <code>ndigits</code>  منزلًا عشريًا (القيمة الافتراضية هي 0).
+
يعيد التابع <code>truncate</code> العدد الذي استُدعي معه بعد اقتطاع المنازل العشرية منه بمقدار محدَّد.
===[[Ruby/Numeric/zero-3F | التابع zero?]]===
+
===[[Ruby/Numeric/zero-3F |<code>zero?‎</code>]]===
يعيد  القيمة <code>true</code> إن كانت <code>num</code> قيمة هي الصفر.
+
يتحقق إن كانت قيمة العدد الذي استُدعي معه تساوي الصفر.
 +
 
 +
== ملاحظات إضافية ==
 +
الصنف <code>Numeric</code> هو صنفٌ أساسيٌ لأنواع الكائنات الأخرى العددية. اطلع مثلًا على الشيفرة التالية:<syntaxhighlight lang="ruby">
 +
puts 100.class        # Fixnum
 +
puts (100.2).class     # Float
 +
puts (100**100).class # Bignum
 +
</syntaxhighlight>في بعض الحالات، تستبدل هذه الأصناف التوابع المعرَّفة في هذا الصنف.
 +
 
 +
لفهم سلوك أنواع محدَّدة من الأعداد، انتقل إلى التوثيق المخصص بهم واطَّلع عليه.
  
 
 
==مصادر<span> </span>==
 
==مصادر<span> </span>==
*[http://ruby-doc.org/core-2.5.1/NotImplementedError.html قسم الصنف Numeric في توثيق روبي الرسمي.]
+
*[http://ruby-doc.org/core-2.5.1/Numeric.html قسم الصنف Numeric في توثيق روبي الرسمي.]
<noinclude>{{DISPLAYTITLE: صفحة الصنف <code>Numeric</code> في روبي}}</noinclude>
+
<noinclude>{{DISPLAYTITLE:الصنف <code>Numeric</code> في روبي}}</noinclude>
 
[[تصنيف: Ruby]]
 
[[تصنيف: Ruby]]
 +
[[تصنيف: Ruby Class]]
 
[[تصنيف: Ruby Numeric]]
 
[[تصنيف: Ruby Numeric]]

المراجعة الحالية بتاريخ 20:25، 20 نوفمبر 2018

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

يسمح الصنف Numeric بتمثيل (instantiation) الكائنات المحجوزة في الكومة (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 التابع 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)

modulo

يعيد باقي قسم عدد على آخر.

+

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

-

يمثِّل المعامل - الأحادي إشارة الناقص التي تسبق العدد لتشير إلى أنه عدد سالب.

<=>

يوازن المعامل <=> بين عددين ثمَّ يعيد القيمة 0 إن كان هذان العددان متساويين، وإلا فسيُعيد القيمةnil.

abs

يعيد القيمة المطلقة للعدد الذي استُدعي معه.

abs2

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

angle

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

arg

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

ceil

يعيد أصغر عدد من الأعداد الأكبر من أو تساوي العدد الذي استُدعي معه وبدقة محدَّدة.

clone

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

coerce

إن كان العدد المُمرَّر إلى التابع numeric من نفس نوع العدد الذي استُدعي معه، فسيعيد مصفوفة تحوي هذين العددين. خلاف ذلك، سيحول هذين العددين إلى النوع Float ويعيدهما في مصفوفة.

conj

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

conjugate

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

denominator

يعيد المقام (denominator) للعدد الكسري الذي استدعي معه، ويكون دائمًا موجبًا.

div

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

divmod

يعيد مصفوفة تحتوي على حاصل (quotient) وباقي قسمة العدد الذي استُدعي معه على العدد المُمرَّر إليه.

dup

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

eql?‎

يتحقق إن كان العدد الذي استُدعي معه والعدد المُمرَّر إليه من نفس النوع ومتساويين.

fdiv

يجري عملية القسمة بين العدد الذي استدعي معه والعدد الذي مُرِّر إليه ثم يعيد الناتج في عدد عشري.

?finite

يتحقق إن كان العدد الذي استُدعي معه عددًا منتهيًا (finite).

floor

يعيد أكبر عدد من الأعداد الأصغر من أو تساوي العدد الذي استُدعي معه وبدقة محدَّدة.

i

يعيد العدد التخيلي (imaginary number) المقابل للعدد الذي استدعي معه.

imag

يعيد الصفر.

imaginary

يعيد الصفر.

infinite?‎

يتحقق إذا ما إن كان العدد الذي استدعي معه منتهيًا (finite) أو غير منتهي من الطرف السالب (‎-Infinity) أو غير منتهي من الطرف الموجب (‎+Infinity).

integer?‎

يتحقق إن كان العدد الذي استُدعي معه من النوع Integer.

magnitude

يعيد القيمة المطلقة للعدد الذي استُدعي معه.

modulo

يعيد باقي قسم عدد على آخر.

?negative

يتحقق إن كان العدد الذي استُدعي معه عددًا سالبًا.

?nonzero

يعيد العدد الذي استُدعي معه إن كان غير صفري، أو يعيد القيمة nil خلاف ذلك.

numerator

يعيد البسط (numerator) للعدد الكسري الذي استدعي معه.

phase

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

polar

يعيد المصفوفة [num.abs، num.arg]، إذ num هو العدد الذي استدعي معه.

?positive

يتحقق إن كان العدد الذي استُدعي معه عددًا موجبًا.

quo

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

real

يعيد العدد الذي استدعي معه (الكائن self).

real?‎

يتحقق إن كان العدد الذي استُدعي معه عددًا حقيقيًّا (أي ليس من النوع Complex).

rect

يعيد المصفوفة [num, 0] إذ num يمثل العدد الذي استُدعي معه.

rectangular

يعيد المصفوفة [num, 0] إذ num يمثل العدد الذي استُدعي معه.

remainder

يعيد باقي قسم عدد على آخر. أي عندما يُستدعَى التابع بالشكل x.remainder(y)‎، فإنه يماثل الاستدعاء x-y*(x/y).truncate.

round

يقرِّب العدد الذي استُدعي معه إلى أقرب قيمة بدقة محدَّدة.

step

يستدعي الكتلة المعطاة مع تمرير سلسلة من الأعداد إليها بدءًا من العدد الذي استُدعي معه وحتى قيمة محدَّدة مع الزيادة أو الطرح بقدار خطوة ثابتة معطاة.

to_c

يحول العدد الذي استُدعي معه إلى عدد عقدي.

to_int

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

truncate

يعيد التابع truncate العدد الذي استُدعي معه بعد اقتطاع المنازل العشرية منه بمقدار محدَّد.

zero?‎

يتحقق إن كانت قيمة العدد الذي استُدعي معه تساوي الصفر.

ملاحظات إضافية

الصنف Numeric هو صنفٌ أساسيٌ لأنواع الكائنات الأخرى العددية. اطلع مثلًا على الشيفرة التالية:

puts 100.class         # Fixnum
puts (100.2).class     # Float
puts (100**100).class  # Bignum

في بعض الحالات، تستبدل هذه الأصناف التوابع المعرَّفة في هذا الصنف.

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

مصادر