الفرق بين المراجعتين لصفحة: «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
قيمة هي الصفر.