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

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
ط (مراجعة وتدقيق.)
 
سطر 1: سطر 1:
 
الصنف <code>Numeric</code> هو الصنف الذي يجب أن ترثه كل الأصناف العددية عالية المستوى.
 
الصنف <code>Numeric</code> هو الصنف الذي يجب أن ترثه كل الأصناف العددية عالية المستوى.
 
+
__TOC__
يسمح الصنف <code>Numeric</code> بتحديد التخزين heap-allocated objects للكائنات. الأصناف العددية الأساسية الأخرى، مثل <code>Integer</code>، تُنزّل كأصناف آنية، والذي يعني أنّ كل عدد صحيح هو كائن غير قابل للتغيير (immutable)، والذي بُمرر دائمًا بقيمته.<syntaxhighlight lang="ruby">
+
يسمح الصنف <code>Numeric</code> بتمثيل (instantiation) الكائنات المحجوزة في الكومة (heap-allocated objects). تُنفَّذ الأصناف العددية الأساسية الأخرى، مثل <code>[[Ruby/Integer|Integer]]</code>، كأصناف آنيَّة، أي أنّ كل عدد صحيح هو كائن غير قابل للتغيير (immutable)، والذي يُمرَّر دائمًا بقيمته. اطلع على المثال التالي:<syntaxhighlight lang="ruby">
 
a = 1
 
a = 1
 
1.object_id == a.object_id  #=> true
 
1.object_id == a.object_id  #=> true
  
</syntaxhighlight>وهكذا لا يمكن أن يكون هناك إلا نسخة (instance) واحدة فقط من العدد الصحيح <code>1</code>. تضمن روبي هذا عن طريق منع إنشاء نسخ جديدة ومنع التكرار.<syntaxhighlight lang="ruby">
+
</syntaxhighlight>لا يمكن أن يكون هناك إلا نسخة (instance) واحدة فقط من العدد الصحيح <code>1</code>. تضمن روبي بهذا منع إنشاء نسخ جديدة ومنع التكرار.<syntaxhighlight lang="ruby">
 
Integer.new(1)  #=> NoMethodError: undefined method `new' for Integer:Class
 
Integer.new(1)  #=> NoMethodError: undefined method `new' for Integer:Class
 
1.dup            #=> TypeError: can't dup Integer
 
1.dup            #=> TypeError: can't dup Integer
سطر 11: سطر 11:
 
</syntaxhighlight>لهذا السبب، يجب استخدام الصنف <code>Numeric</code> عند تعريف أصناف عددية أخرى.
 
</syntaxhighlight>لهذا السبب، يجب استخدام الصنف <code>Numeric</code> عند تعريف أصناف عددية أخرى.
  
يجب أن تقوم الأصناف التي ترث من <code>Numeric</code> بتنزيل (implement) التابع <code>coerce</code>، والذي يعيد مصفوفة ثنائية تحتوي على كائن مُحوّل (coerced) إلى نسخة من الصنف الجديد والكائن self (انظر <code>[[Ruby/Numeric/coerce|coerce]]</code>).
+
يجب أن تنفِّذ الأصناف التي ترث من الصنف <code>Numeric</code> التابع [[Ruby/Numeric/coerce|<code>coerce</code>]]، والذي يعيد مصفوفة بعنصرين تحتوي على كائن مُحوّل (coerced) إلى نسخة من الصنف الجديد والكائن <code>self</code> (انظر توثيق التابع <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">
+
يجب أيضا على الأصناف الوراثة أن تنفِّذ معاملات العمليات الحسابية (<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
 
class Tally < Numeric
 
   def initialize(string)
 
   def initialize(string)
سطر 59: سطر 59:
  
 
==توابع النسخ العامة (Public Instance Methods)==
 
==توابع النسخ العامة (Public Instance Methods)==
=== [[Ruby/Numeric/mod|التابع %]]===
+
=== [[Ruby/Numeric/mod|<code>modulo</code>]]===
يعيد <code>x.modulo(y)‎</code> ناتج التعبير <code>x-y*(x/y).floor</code>.
+
يعيد باقي قسم عدد على آخر.
=== [[Ruby/Numeric/plus|التابع +@]]===
+
=== [[Ruby/Numeric/plus|<code>+</code>]]===
علامة الإضافة الأحادية (Unary Plus)
+
يمثِّل المعامل <code>+</code> الأحادي إشارة الزائد التي تسبق العدد لتشير إلى أنه عدد موجب.
=== [[Ruby/Numeric/minus|التابع -@]]===
+
=== [[Ruby/Numeric/minus|<code>-</code>]]===
علامة ناقص الأحادية (Unary Minus)
+
يمثِّل المعامل <code>-</code> الأحادي إشارة الناقص التي تسبق العدد لتشير إلى أنه عدد سالب.
=== [[Ruby/Numeric/compar|التابع <=>]]===
+
=== [[Ruby/Numeric/compar|<code><=></code>]]===
يعيد  القيمة صفر إن كان <code>number</code> يساوي <code>other</code>، وإلا فسيُعيد <code>nil</code>.
+
يوازن المعامل <code><=></code> بين عددين ثمَّ يعيد القيمة 0 إن كان هذان العددان متساويين، وإلا فسيُعيد القيمة<code>nil</code>.
===[[Ruby/Numeric/abs | التابع abs]]===
+
===[[Ruby/Numeric/abs |<code>abs</code>]]===
يعيد القيمة المطلقة لـ <code>num</code>.
+
يعيد القيمة المطلقة للعدد الذي استُدعي معه.
===[[Ruby/Numeric/abs2 | التابع abs2]]===
+
===[[Ruby/Numeric/abs2 |<code>abs2</code>]]===
 
يعيد مربع العدد الذي استُدعي معه.
 
يعيد مربع العدد الذي استُدعي معه.
===[[Ruby/Numeric/angle | التابع angle]]===
+
===[[Ruby/Numeric/angle |<code>angle</code>]]===
يعيد القيمة 0 إن كانت القيمة موجبة، أو <code>pi</code> خلاف ذلك.
+
يعيد القيمة <code>0</code> إن كان العدد الذي استُدعي معه موجبًا، أو القيمة <code>[[Ruby/Math/PI|pi]]</code> خلاف ذلك.
===[[Ruby/Numeric/arg | التابع arg]]===
+
===[[Ruby/Numeric/arg |<code>arg</code>]]===
يعيد القيمة 0 إن كانت القيمة موجبة، أو <code>pi</code> خلاف ذلك.
+
يعيد القيمة <code>0</code> إن كان العدد الذي استُدعي معه موجبًا، أو القيمة <code>[[Ruby/Math/PI|pi]]</code> خلاف ذلك.
===[[Ruby/Numeric/ceil | التابع ceil]]===
+
===[[Ruby/Numeric/ceil |<code>ceil</code>]]===
يعيد التابع <code>ceil</code> أصغر عدد من الأعداد الأكبر من أو تساوي العدد الذي استُدعي معه بدقة <code>ndigits</code> موضعا عشريًا (القيمة الافتراضية هي 0).
+
يعيد أصغر عدد من الأعداد الأكبر من أو تساوي العدد الذي استُدعي معه وبدقة محدَّدة.
===[[Ruby/Numeric/clone | التابع clone]]===
+
===[[Ruby/Numeric/clone |<code>clone</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>]]===
يعيد الكائن <code>self</code>.
+
يعيد الكائن الذي استُدعي معه (الكائن <code>self</code>).
===[[Ruby/Numeric/conjugate | التابع conjugate]]===
+
===[[Ruby/Numeric/conjugate |<code>conjugate</code>]]===
يعيد  الكائن <code>self</code>.
+
يعيد الكائن الذي استُدعي معه (الكائن <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>/</code> لإجراء عملية القسمة على العددين المعطيين، ثم يحوّل النتيجة إلى عدد صحيح.  
===[[Ruby/Numeric/divmod | التابع divmod]]===
+
===[[Ruby/Numeric/divmod |<code>divmod</code>]]===
يعيد التابع <code>divmod</code> مصفوفة تحتوي على الحاصل (quotient) والباقي الناتج عن قسمة العدد الذي استُدعي معه على الوسيط المعطى <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> من نفس النوع وكانت قيممهما متساوية.  
+
يتحقق إن كان العدد الذي استُدعي معه والعدد المُمرَّر إليه من نفس النوع ومتساويين.
===[[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>floor</code> أكبر عدد من الأعداد الأصغر من أو تساوي العدد الذي استُدعي معه بدقة <code>ndigits</code> منزلا عشريًا (القيمة الافتراضية هي <code>0</code>).
+
يعيد أكبر عدد من الأعداد الأصغر من أو تساوي العدد الذي استُدعي معه وبدقة محدَّدة.
===[[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> أو ‎<code>-1</code> أو <code>1</code> اعتمادًا على ما إن كانت القيمة منتهية (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 إن كانت القيمة موجبة ، أو <code>pi</code> خلاف ذلك.
+
يعيد القيمة <code>0</code> إن كان العدد الذي استُدعي معه موجبًا، أو يعيد القيمة <code>[[Ruby/Math/PI|pi]]</code> خلاف ذلك.
===[[Ruby/Numeric/polar | التابع polar]]===
+
===[[Ruby/Numeric/polar |<code>polar</code>]]===
يعيد المصفوفة <code>[num.abs، num.arg]</code>.
+
يعيد المصفوفة <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>]]===
يعيد التابع <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>]]===
يعيد  المصفوفة<code>[num, 0]</code>.
+
يعيد المصفوفة <code>[num, 0]</code> إذ <code>num</code> يمثل العدد الذي استُدعي معه.
===[[Ruby/Numeric/rectangular | التابع rectangular]]===
+
===[[Ruby/Numeric/rectangular |<code>rectangular</code>]]===
يعيد  المصفوفة <code>[num, 0]</code>.
+
يعيد المصفوفة <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>round</code> العدد الذي استُدعي معه مُقرّبًا إلى أقرب قيمة بدقة <code>ndigits</code> منزلًا عشريًا (القيمة الافتراضية هي <code>0</code>).
+
يقرِّب العدد الذي استُدعي معه إلى أقرب قيمة بدقة محدَّدة.
===[[Ruby/Numeric/step | التابع step]]===
+
===[[Ruby/Numeric/step |<code>step</code>]]===
يستدعي التابع <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>truncate</code> العدد الذي استُدعي معه مُقتطعًا (نحو الصفر) بدقة <code>ndigits</code> (انظر فقرة البنية العامة) منزلًا عشريًا (القيمة الافتراضية هي <code>0</code>).
+
يعيد التابع <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/Numeric.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

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

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

مصادر