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

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
سطر 2: سطر 2:
 
[[تصنيف: Ruby]]
 
[[تصنيف: Ruby]]
 
[[تصنيف: 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>) أن يقوم كائن بداية المجال بتقديم (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
 
   include Comparable
 
   include Comparable
 
   attr :length
 
   attr :length
سطر 25: سطر 34:
 
   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>
 +
==توابع الصنف العامة (Public Class Methods)==
 +
===[[Ruby/Range/new| التابع new]]===
 +
ينشئ  مجالًا.
  
==توابع الصنف العامة (Public Class Methods)==
+
== توابع النسخة العامة (Public Instance 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| المعامل ==]]===
===[[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| المعامل ===]]===
===[[Ruby/Range/case_equality | التابع ===]]===
+
يعيد  القيمة <code>true</code> إن كان <code>obj</code> أحد عناصر المجال،
يعيد  القيمة <code>true</code> إن كان <code>obj</code> أحد عناصر المجال، أو <code>false</code> خلاف ذلك.  المعامل <code>===</code> هو معلم المقارنة الذي تستخدمه عبارات <code>case</code>.
+
===[[Ruby/Range/begin| التابع begin]]===
===[[Ruby/Range/begin | التابع begin]]===
 
 
يعيد الكائن الذي يحدد بداية المجال.
 
يعيد الكائن الذي يحدد بداية المجال.
===[[Ruby/Range/bsearch | التابع bsearch]]===
+
===[[Ruby/Range/bsearch| التابع bsearch]]===
باستخدام البحث الثنائي (binary search)، يبحث  عن قيمة من المجال تفي بالشرط المعطى في مدة O (log n) حيث n هو حجم المجال.
+
يبحث  عن قيمة من المجال تفي بالشرط المعطى.
===[[Ruby/Range/cover-3F | التابع cover?‎]]===
+
===[[Ruby/Range/cover-3F| التابع cover?‎]]===
 
يعيد  القيمة <code>true</code> إن كان <code>obj</code> محصورًا بين بداية ونهاية المجال.
 
يعيد  القيمة <code>true</code> إن كان <code>obj</code> محصورًا بين بداية ونهاية المجال.
===[[Ruby/Range/each | التابع each]]===
+
===[[Ruby/Range/each| التابع each]]===
 
يُكرر  تنفيذ الكتلة المعطاة مع تمرير عناصر المجال إليها بالتتابع.
 
يُكرر  تنفيذ الكتلة المعطاة مع تمرير عناصر المجال إليها بالتتابع.
===[[Ruby/Range/end | التابع end]]===
+
===[[Ruby/Range/end| التابع end]]===
 
يعيد  الكائن الذي يحدد نهاية المجال.
 
يعيد  الكائن الذي يحدد نهاية المجال.
===[[Ruby/Range/eql-3F | التابع eql?‎]]===
+
===[[Ruby/Range/eql-3F| التابع eql?‎]]===
يعيد  القيمة <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| التابع exclude_end?‎]]===
 
يعيد  القيمة <code>true</code> إن كان المجال يستثني قيمته النهائية.
 
يعيد  القيمة <code>true</code> إن كان المجال يستثني قيمته النهائية.
===[[Ruby/Range/first | التابع first]]===
+
===[[Ruby/Range/first| التابع first]]===
 
يعيد  الكائن الأول في المجال، أو يعيد مصفوفة مكونة من أول <code>n</code> عنصر.
 
يعيد  الكائن الأول في المجال، أو يعيد مصفوفة مكونة من أول <code>n</code> عنصر.
===[[Ruby/Range/hash | التابع hash]]===
+
===[[Ruby/Range/hash| التابع hash]]===
يحسب  رمز التكويد (hash-code) لهذا المجال. مجالان عنصرا بدايتهما ونهايتهما متساويان (باستخدام المعامل <code>[[Ruby/Range/eql-3F|eql?‎]]</code>)، وقيمة <code>[[Ruby/Range/exclude_end-3F|exclude_end?]]</code> الخاصة بهما متساوية سيُولّدان نفس رمز التكويد.
+
يحسب  رمز التكويد (hash-code) للمجال.
===[[Ruby/Range/include-3F | التابع include?‎]]===
+
===[[Ruby/Range/include-3F| التابع include?‎]]===
يعيد  القيمة <code>true</code> إن كان <code>obj</code> عنصرًا من المجال، أو يعيد <code>false</code> خلاف ذلك.  إن كانت عنصرا البداية والنهاية عددان، قستتم المقارنة وفقًا لمقدار (magnitude) القيم.
+
يعيد  القيمة <code>true</code> إن كان <code>obj</code> عنصرًا من المجال،
===[[Ruby/Range/inspect | التابع inspect]]===
+
===[[Ruby/Range/inspect| التابع inspect]]===
 
بُحوّل  المجال  إلى شكل قابل للطباعة (باستخدام <code>inspect</code> لتحويل عنصري البداية والنهاية).
 
بُحوّل  المجال  إلى شكل قابل للطباعة (باستخدام <code>inspect</code> لتحويل عنصري البداية والنهاية).
===[[Ruby/Range/last | التابع last]]===
+
===[[Ruby/Range/last| التابع last]]===
 
يعيد  العنص الأخير في المجال، أو مصفوفة مؤلفة من آخر <code>n</code> عنصر.
 
يعيد  العنص الأخير في المجال، أو مصفوفة مؤلفة من آخر <code>n</code> عنصر.
===[[Ruby/Range/max | التابع max]]===
+
===[[Ruby/Range/max| التابع max]]===
يعيد  القيمة القصوى من المجال. يعيد <code>nil</code> إن كان عنصر بداية المجال أكبر من عنصر نهايته. ويعيد <code>nil</code> إن كانت قيمة البداية لمجال إقصائي (exclusive) مساوية لقيمة نهايته.
+
يعيد  القيمة القصوى من المجال. ي
===[[Ruby/Range/member-3F | التابع member?‎]]===
+
===[[Ruby/Range/member-3F| التابع member?‎]]===
يعيد  القيمة <code>true</code> إن كان <code>obj</code> عنصرًا من المجال ، أو يعيد <code>false</code> خلاف ذلك.  إن كان عنصرا البداية والنهاية عددين، فستتم المقارنة وفقًا لمقدار (magnitude) القيم.
+
يعيد  القيمة <code>true</code> إن كان <code>obj</code> عنصرًا من المجال.
===[[Ruby/Range/min | التابع min]]===
+
===[[Ruby/Range/min| التابع min]]===
يعيد  القيمة الدنيا من المجال. يعيد <code>nil</code> إن كانت قيمة بداية المجال أكبر من قيمة نهايته. أو يعيد <code>nil</code> إن كانت قيمة البداية للمجال الإقصائي (exclusive، أي أنه يستثني عنصر النهاية) مساوية لقيمة عنصر النهاية.
+
يعيد  القيمة الدنيا من المجال.
===[[Ruby/Range/size | التابع size]]===
+
===[[Ruby/Range/size| التابع size]]===
يعيد  عدد العناصر في المجال. يجب أن يكون كل من بداية ونهاية <code>[[Ruby/Range|Range]]</code> قيمتان عدديتان (<code>[[Ruby/Numeric|Numeric]]</code>)، وإلا فستُعاد nil.
+
يعيد  عدد العناصر في المجال.
===[[Ruby/Range/step | التابع step]]===
+
===[[Ruby/Range/step| التابع step]]===
يكرر  الكتلة المعطاة ويمرر إليها <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| التابع to_s]]===
بُحوّل  المجال  إلى شكل قابل للطباعة (باستخدام <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 في توثيق روبي الرسمي.]

مراجعة 19:51، 30 أكتوبر 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) أن يقوم كائن بداية المجال بتقديم (implement) تابع يُسمى 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

توابع الصنف العامة (Public Class Methods)

التابع new

ينشئ مجالًا.

توابع النسخة العامة (Public Instance Methods)

المعامل ==

معامل التساوي.

المعامل ===

يعيد القيمة true إن كان obj أحد عناصر المجال،

التابع begin

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

التابع bsearch

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

التابع cover?‎

يعيد القيمة true إن كان obj محصورًا بين بداية ونهاية المجال.

التابع each

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

التابع end

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

التابع eql?‎

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

التابع exclude_end?‎

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

التابع first

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

التابع hash

يحسب رمز التكويد (hash-code) للمجال.

التابع include?‎

يعيد القيمة true إن كان obj عنصرًا من المجال،

التابع inspect

بُحوّل المجال إلى شكل قابل للطباعة (باستخدام inspect لتحويل عنصري البداية والنهاية).

التابع last

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

التابع max

يعيد القيمة القصوى من المجال. ي

التابع member?‎

يعيد القيمة true إن كان obj عنصرًا من المجال.

التابع min

يعيد القيمة الدنيا من المجال.

التابع size

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

التابع step

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

التابع to_s

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