صفحة الصنف 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
قيمة هي الصفر.