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

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
ط (مراجعة وتدقيق.)
 
(مراجعة متوسطة واحدة بواسطة مستخدم واحد آخر غير معروضة)
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE: صفحة الصنف <code>Range</code> في روبي}}</noinclude>
+
<noinclude>{{DISPLAYTITLE:الصنف <code>Range</code> في روبي}}</noinclude>
 
[[تصنيف: Ruby]]
 
[[تصنيف: Ruby]]
 +
[[تصنيف: Ruby Class]]
 
[[تصنيف: Ruby Range]]
 
[[تصنيف: Ruby Range]]
يمثل الصنف <code>Range</code> مجالًا - مجموعة من القيم لها بداية ونهاية. يمكن إنشاء المجالات باستخدام المحارف s<code>..</code>e و s<code>...</code>e ، أو باستخدام <code>[[Ruby/Range/new|::new]]</code>. المجالات المُنشأة باستخدام الصياغة النقطية <code>..</code> تشمل عنصري البداية والنهاية. أما تلك المُنشأة باستخدام <code>...</code> فلن تشمل قيمة النهاية. عند استخدامها كمكرر (iterator)، ستعيد المجالات بالتتابع كل قيمها. <syntaxhighlight lang="ruby">(-1..-5).to_a      #=> []
+
يمثل الصنف <code>Range</code> مجالًا (مجموعة) من القيم لها بداية ونهاية.  
 +
 
 +
يمكن إنشاء المجالات باستخدام الصياغة الحرفية بالشكل <code>s..e</code> و <code>s...e</code> ، أو باستخدام التابع الباني <code>[[Ruby/Range/new|new]]</code>. المجالات المُنشأة باستخدام الصياغة <code>..</code> تشمل عنصري البداية والنهاية. أما تلك المُنشأة باستخدام الصياغة <code>...</code> فلن تشمل قيمة النهاية. عند استخدامها كمكرر (iterator)، ستعيد المجالات كل قيمها بالتتابع.<syntaxhighlight lang="ruby">(-1..-5).to_a      #=> []
 
(-5..-1).to_a      #=> [-5, -4, -3, -2, -1]
 
(-5..-1).to_a      #=> [-5, -4, -3, -2, -1]
 
('a'..'e').to_a    #=> ["a", "b", "c", "d", "e"]
 
('a'..'e').to_a    #=> ["a", "b", "c", "d", "e"]
 
('a'...'e').to_a  #=> ["a", "b", "c", "d"]
 
('a'...'e').to_a  #=> ["a", "b", "c", "d"]
‎</syntaxhighlight> تخصيص المجالات <code>[[Ruby//class-Range-label-Custom+Objects+in+Ranges|¶]]</code> <code>[[Ruby//top|↑]]</code> يمكن إنشاء المجالات باستخدام أيٍّ من الكائنات التي يمكن المقارنة بينها باستخدام المعامل <code><=></code>. تتوقع التوابع التي تتعامل مع المجالات كتسلسلات (#each والتوابع الموروثة من <code>[[Ruby/Enumerable|Enumerable]]</code>) أن يقوم كائن بداية المجال بتقديم (implement) تابع <code>succ</code> يعيد الكائن الموالي. يتطلب التابعان <code>[[Ruby/Range/step|step]]</code> و <code>[[Ruby/Range/include-3F|include?]]</code> من كائن بداية المجال تقديم التابع <code>succ</code>، أو أن يكون قيمة عددية. في الصنف <code>Xs</code> أدناه قُدِّم كلّ من <code><=></code> و <code>succ</code> حتى يُستخدم <code>Xs</code> لبناء المجالات. لاحظ أنه تم تضمين الوحدة <code>[[Ruby/Comparable|Comparable]]</code> بحيث يتم تعريف التابع <code>[[Ruby/Range/equality_operator|==]]</code> بالتوافق مع <code><=></code>. <syntaxhighlight lang="ruby">class Xs                # represent a string of 'x's
+
‎</syntaxhighlight>
 +
 
 +
== تخصيص المجالات ==
 +
يمكن إنشاء المجالات باستخدام أيٍّ من الكائنات التي يمكن المقارنة بينها باستخدام المعامل <code><=></code>. تتوقع التوابع التي تتعامل مع المجالات كتسلسلات (مثل التابع <code>each</code> والتوابع الموروثة من <code>[[Ruby/Enumerable|Enumerable]]</code>) أن يقدم كائن بداية المجال تابعًا يُسمى <code>succ</code> يعيد الكائن التالي. يتطلب التابعان <code>[[Ruby/Range/step|step]]</code> و <code>[[Ruby/Range/include-3F|include‎?]]</code> من عنصر بداية المجال تقديم التابع <code>succ</code>، أو أن يكون قيمة عددية.
 +
 
 +
في الصنف <code>Xs</code>، أدناه قُدِّم كلّ من المعاملين <code><=></code> و <code>succ</code> حتى يُستخدم <code>Xs</code> لبناء المجالات. لاحظ أنه تم تضمين الوحدة <code>[[Ruby/Comparable|Comparable]]</code> حتى يتم تعريف المعامل <code>[[Ruby/Range/equality operator|==]]</code> بالتوافق مع المعامل <code><=></code>.<syntaxhighlight lang="ruby">class Xs                # represent a string of 'x's
 
   include Comparable
 
   include Comparable
 
   attr :length
 
   attr :length
سطر 25: سطر 33:
 
   end
 
   end
 
end
 
end
‎</syntaxhighlight> مثال على استخدام <code>Xs</code> لإنشاء مجال: <syntaxhighlight lang="ruby">r = Xs.new(3)..Xs.new(6)  #=> xxx..xxxxxx
+
‎</syntaxhighlight>الشيفرة التالية هي مثال على استخدام الصنف <code>Xs</code> لإنشاء مجال:<syntaxhighlight lang="ruby">r = Xs.new(3)..Xs.new(6)  #=> xxx..xxxxxx
 
r.to_a                    #=> [xxx, xxxx, xxxxx, xxxxxx]
 
r.to_a                    #=> [xxx, xxxx, xxxxx, xxxxxx]
 
r.member?(Xs.new(5))      #=> true
 
r.member?(Xs.new(5))      #=> true
‎</syntaxhighlight>  
+
‎</syntaxhighlight>
 +
==توابع الصنف العامة==
 +
===[[Ruby/Range/new|<code>new</code>]]===
 +
ينشئ مجالًا من قيمتين تمثِّل إحداها بداية المجال والأخرى نهايته.
  
==توابع الصنف العامة (Public Class Methods)==
+
== توابع النسخة العامة ==
===[[Ruby/Range/new | التابع new]]===
+
 
ينشئ  مجالًا باستخدام الوسيطين <code>[[Ruby/Range/begin|begin]]</code> و <code>[[Ruby/Range/end|end]]</code> . في حال حذف الوسيط <code>exclude_end</code> أو <code>false</code> ، فسيشل <code>rng</code> كائن النهاية. خلاف ذلك، سيُستبعد.
+
===[[Ruby/Range/equality operator|<code>==</code>]]===
===[[Ruby/Range/equality_operator | التابع ==]]===
+
يتحقق من تساوي مجالين مع بعضهما بعضًا.
يعيد  القيمة <code>true</code> فقط إن كان <code>obj</code> من النوع <code>[[Ruby/Range|Range]]</code>، وكان له نفس عنصري البداية والنهاية (بمقارنتهما بالمعامل <code>==</code>)، وكان له نفس إعدادات <code>[[Ruby/Range/exclude_end-3F|exclude_end?]]</code> مقارنة ب.
+
===[[Ruby/Range/case equality|<code>===</code>]]===
===[[Ruby/Range/case_equality | التابع ===]]===
+
يعيد القيمة <code>true</code> إن كانت قيمةٌ أو كائنٌ ما أحد عناصر المجال (أي تقع ضمنه).
يعيد القيمة <code>true</code> إن كان <code>obj</code> أحد عناصر المجال، أو <code>false</code> خلاف ذلك.  المعامل <code>===</code> هو معلم المقارنة الذي تستخدمه عبارات <code>case</code>.
+
===[[Ruby/Range/begin|<code>begin</code>]]===
===[[Ruby/Range/begin | التابع begin]]===
 
 
يعيد الكائن الذي يحدد بداية المجال.
 
يعيد الكائن الذي يحدد بداية المجال.
===[[Ruby/Range/bsearch | التابع bsearch]]===
+
===[[Ruby/Range/bsearch|<code>bsearch</code>]]===
باستخدام البحث الثنائي (binary search)، يبحث عن قيمة من المجال تفي بالشرط المعطى في مدة O (log n) حيث n هو حجم المجال.
+
يبحث عن قيمة من المجال تفي بالشرط المعطى.
===[[Ruby/Range/cover-3F | التابع cover?‎]]===
+
===[[Ruby/Range/cover-3F|<code>cover?‎</code>]]===
يعيد  القيمة <code>true</code> إن كان <code>obj</code> محصورًا بين بداية ونهاية المجال.
+
يتحقق إن كان الكائن المُمرَّر إليه محصورًا بين بداية ونهاية المجال.
===[[Ruby/Range/each | التابع each]]===
+
===[[Ruby/Range/each|<code>each</code>]]===
يُكرر تنفيذ الكتلة المعطاة مع تمرير عناصر المجال إليها بالتتابع.
+
يُكرر تنفيذ الكتلة المعطاة مع تمرير عناصر المجال إليها بالتتابع.
===[[Ruby/Range/end | التابع end]]===
+
===[[Ruby/Range/end|<code>end</code>]]===
يعيد الكائن الذي يحدد نهاية المجال.
+
يعيد الكائن الذي يحدد نهاية المجال.
===[[Ruby/Range/eql-3F | التابع eql?‎]]===
+
===[[Ruby/Range/eql-3F|<code>eql?‎</code>]]===
يعيد  القيمة <code>true</code> فقط إن كان <code>obj</code> من النوع <code>[[Ruby/Range|Range]]</code>، وكان له نفس عنصري البداية والنهاية (بمقارنتها بالمعامل <code>eql?‎</code>) ، وكان له نفس إعدادات <code>[[Ruby/Range/exclude_end-3F|exclude_end?]]</code> مقارنة ب.
+
يتحقق من تساوي مجالين.
===[[Ruby/Range/exclude_end-3F | التابع exclude_end?‎]]===
+
===[[Ruby/Range/exclude end-3F|<code>exclude_end?‎</code>]]===
يعيد  القيمة <code>true</code> إن كان المجال يستثني قيمته النهائية.
+
يتحقق إن كان المجال يستثني قيمته النهائية.
===[[Ruby/Range/first | التابع first]]===
+
===[[Ruby/Range/first|<code>first</code>]]===
يعيد الكائن الأول في المجال، أو يعيد مصفوفة مكونة من أول <code>n</code> عنصر.
+
يعيد الكائن الأول في المجال، أو يعيد مصفوفة مكونة من أول <code>n</code> عنصر.
===[[Ruby/Range/hash | التابع hash]]===
+
===[[Ruby/Range/hash|<code>hash</code>]]===
يحسب رمز التكويد (hash-code) لهذا المجال. مجالان عنصرا بدايتهما ونهايتهما متساويان (باستخدام المعامل <code>[[Ruby/Range/eql-3F|eql?‎]]</code>)، وقيمة <code>[[Ruby/Range/exclude_end-3F|exclude_end?]]</code> الخاصة بهما متساوية سيُولّدان نفس رمز التكويد.
+
يحسب الشيفرة hash للمجال الذي استدعي معه.
===[[Ruby/Range/include-3F | التابع include?‎]]===
+
===[[Ruby/Range/include-3F|<code>include?</code>]]===
يعيد  القيمة <code>true</code> إن كان <code>obj</code> عنصرًا من المجال، أو يعيد <code>false</code> خلاف ذلك.  إن كانت عنصرا البداية والنهاية عددان، قستتم المقارنة وفقًا لمقدار (magnitude) القيم.
+
يتحقق إن كان كائنٌ ما عنصرًا من المجال المعطى.
===[[Ruby/Range/inspect | التابع inspect]]===
+
===[[Ruby/Range/inspect|<code>inspect</code>]]===
بُحوّل  المجال إلى شكل قابل للطباعة (باستخدام <code>inspect</code> لتحويل عنصري البداية والنهاية).
+
يحوّل المجال الذي استُدعي معه إلى شكل قابل للطباعة.
===[[Ruby/Range/last | التابع last]]===
+
===[[Ruby/Range/last|<code>last</code>]]===
يعيد العنص الأخير في المجال، أو مصفوفة مؤلفة من آخر <code>n</code> عنصر.
+
يعيد العنصر الأخير في المجال، أو مصفوفة مؤلفة من آخر <code>n</code> عنصر.
===[[Ruby/Range/max | التابع max]]===
+
===[[Ruby/Range/max|<code>max</code>]]===
يعيد القيمة القصوى من المجال. يعيد <code>nil</code> إن كان عنصر بداية المجال أكبر من عنصر نهايته. ويعيد <code>nil</code> إن كانت قيمة البداية لمجال إقصائي (exclusive) مساوية لقيمة نهايته.
+
يعيد أكبر قيمة من المجال المعطى.
===[[Ruby/Range/member-3F | التابع member?‎]]===
+
===[[Ruby/Range/member-3F|<code>member?‎</code>]]===
يعيد  القيمة <code>true</code> إن كان <code>obj</code> عنصرًا من المجال ، أو يعيد <code>false</code> خلاف ذلك.  إن كان عنصرا البداية والنهاية عددين، فستتم المقارنة وفقًا لمقدار (magnitude) القيم.
+
يتحقق إن كان كائنٌ ما عنصرًا من المجال الذي استُدعي معه.
===[[Ruby/Range/min | التابع min]]===
+
===[[Ruby/Range/min|<code>min</code>]]===
يعيد القيمة الدنيا من المجال. يعيد <code>nil</code> إن كانت قيمة بداية المجال أكبر من قيمة نهايته. أو يعيد <code>nil</code> إن كانت قيمة البداية للمجال الإقصائي (exclusive، أي أنه يستثني عنصر النهاية) مساوية لقيمة عنصر النهاية.
+
يعيد أصغر قيمة من المجال.
===[[Ruby/Range/size | التابع size]]===
+
===[[Ruby/Range/size|<code>size</code>]]===
يعيد عدد العناصر في المجال. يجب أن يكون كل من بداية ونهاية <code>[[Ruby/Range|Range]]</code> قيمتان عدديتان (<code>[[Ruby/Numeric|Numeric]]</code>)، وإلا فستُعاد nil.
+
يعيد عدد العناصر في المجال.
===[[Ruby/Range/step | التابع step]]===
+
===[[Ruby/Range/step|<code>step</code>]]===
يكرر  الكتلة المعطاة ويمرر إليها <code>n</code>  عنصرًا من عناصر المجال بالتتابع. إن كان عنصرا البداية والنهاية عددان، فسيضاف <code>n</code> عند كل تكرار. وإلا، فإن <code>step</code> ستستدعي <code>succ</code> للتكرار عبر عناصر المجال.
+
يكرر  الكتلة المعطاة ويمرر إليها <code>n</code>  عنصرًا من عناصر المجال بالتتابع.
===[[Ruby/Range/to_s | التابع to_s]]===
+
===[[Ruby/Range/to s|<code>to_s</code>]]===
بُحوّل  المجال إلى شكل قابل للطباعة (باستخدام <code>[[Ruby/Range/to_s|to_s]]</code> لتحويل عنصري البداية والنهاية).
+
يحوّل المجال إلى شكل قابل للطباعة.
*[http://ruby-doc.org/core-2.5.1/Range.html قسم  الصنف Range في توثيق روبي الرسمي.]
+
 
 +
== مصادر ==
 +
*[http://ruby-doc.org/core-2.5.1/Range.html صفحة الصنف Range في توثيق روبي الرسمي.]

المراجعة الحالية بتاريخ 07:10، 3 ديسمبر 2018

يمثل الصنف Range مجالًا (مجموعة) من القيم لها بداية ونهاية.

يمكن إنشاء المجالات باستخدام الصياغة الحرفية بالشكل s..e و s...e ، أو باستخدام التابع الباني new. المجالات المُنشأة باستخدام الصياغة .. تشمل عنصري البداية والنهاية. أما تلك المُنشأة باستخدام الصياغة ... فلن تشمل قيمة النهاية. عند استخدامها كمكرر (iterator)، ستعيد المجالات كل قيمها بالتتابع.

(-1..-5).to_a      #=> []
(-5..-1).to_a      #=> [-5, -4, -3, -2, -1]
('a'..'e').to_a    #=> ["a", "b", "c", "d", "e"]
('a'...'e').to_a   #=> ["a", "b", "c", "d"]

تخصيص المجالات

يمكن إنشاء المجالات باستخدام أيٍّ من الكائنات التي يمكن المقارنة بينها باستخدام المعامل <=>. تتوقع التوابع التي تتعامل مع المجالات كتسلسلات (مثل التابع each والتوابع الموروثة من Enumerable) أن يقدم كائن بداية المجال تابعًا يُسمى succ يعيد الكائن التالي. يتطلب التابعان step و include‎?‎ من عنصر بداية المجال تقديم التابع succ، أو أن يكون قيمة عددية.

في الصنف Xs، أدناه قُدِّم كلّ من المعاملين <=> و succ حتى يُستخدم Xs لبناء المجالات. لاحظ أنه تم تضمين الوحدة Comparable حتى يتم تعريف المعامل == بالتوافق مع المعامل <=>.

class Xs                # represent a string of 'x's
  include Comparable
  attr :length
  def initialize(n)
    @length = n
  end
  def succ
    Xs.new(@length + 1)
  end
  def <=>(other)
    @length <=> other.length
  end
  def to_s
    sprintf "%2d #{inspect}", @length
  end
  def inspect
    'x' * @length
  end
end

الشيفرة التالية هي مثال على استخدام الصنف Xs لإنشاء مجال:

r = Xs.new(3)..Xs.new(6)   #=> xxx..xxxxxx
r.to_a                     #=> [xxx, xxxx, xxxxx, xxxxxx]
r.member?(Xs.new(5))       #=> true

توابع الصنف العامة

new

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

توابع النسخة العامة

==

يتحقق من تساوي مجالين مع بعضهما بعضًا.

===

يعيد القيمة true إن كانت قيمةٌ أو كائنٌ ما أحد عناصر المجال (أي تقع ضمنه).

begin

يعيد الكائن الذي يحدد بداية المجال.

bsearch

يبحث عن قيمة من المجال تفي بالشرط المعطى.

cover?‎

يتحقق إن كان الكائن المُمرَّر إليه محصورًا بين بداية ونهاية المجال.

each

يُكرر تنفيذ الكتلة المعطاة مع تمرير عناصر المجال إليها بالتتابع.

end

يعيد الكائن الذي يحدد نهاية المجال.

eql?‎

يتحقق من تساوي مجالين.

exclude_end?‎

يتحقق إن كان المجال يستثني قيمته النهائية.

first

يعيد الكائن الأول في المجال، أو يعيد مصفوفة مكونة من أول n عنصر.

hash

يحسب الشيفرة hash للمجال الذي استدعي معه.

include?‎

يتحقق إن كان كائنٌ ما عنصرًا من المجال المعطى.

inspect

يحوّل المجال الذي استُدعي معه إلى شكل قابل للطباعة.

last

يعيد العنصر الأخير في المجال، أو مصفوفة مؤلفة من آخر n عنصر.

max

يعيد أكبر قيمة من المجال المعطى.

member?‎

يتحقق إن كان كائنٌ ما عنصرًا من المجال الذي استُدعي معه.

min

يعيد أصغر قيمة من المجال.

size

يعيد عدد العناصر في المجال.

step

يكرر الكتلة المعطاة ويمرر إليها n عنصرًا من عناصر المجال بالتتابع.

to_s

يحوّل المجال إلى شكل قابل للطباعة.

مصادر