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

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
(أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE: التجزئة Hash في روبي}}</noinclude> = التجزئة Hash = هي مجموعة تشبه القاموس وتتكون من مفات...')
 
ط
 
(10 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة)
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE: التجزئة Hash في روبي}}</noinclude>
+
<noinclude>{{DISPLAYTITLE: الصنف <code>Hash</code> في روبي}}</noinclude>
 +
النوع <code>Hash</code> (أو [[wikipedia:Hash_table|الجدول Hash]] كما يطلق عليه أحيانًا) هو مجموعة تشبه القاموس ويتكون من مفاتيح فريدة وقيم مرتبطة بها. كما يسمى أيضًا المصفوفات الترابطية، فهو يشبه [[Ruby/Array|المصفوفات]]، ولكن بينما تستخدم [[Ruby/Array|المصفوفة]] فقط الأعداد الصحيحة كفهرس، يسمح النوع <code>Hash</code> باستخدام أيٍّ من أنواع الكائنات لاستعمالها كفهرس وربطها بقيمٍ.
  
= التجزئة Hash =
+
ترتَّب وتحصى القيم في النوع <code>Hash</code> بنفس الترتيب الذي أُدرِجت فيه مفاتيحها المقابلة.
هي مجموعة تشبه القاموس وتتكون من مفاتيح فريدة وقيمها. كما تسمى أيضا المصفوفات الترابطية، فهي تشبه المصفوفات Arrays، ولكن بينما تستخدم Array الأعداد الصحيحة كفهرس، تسمح Hash باستخدام أي من أنواع الكائنات.
 
  
تُرقِّم التجزئات قيمَها بنفس الترتيب الذي أُدرِجت فيه مفاتيحها المقابلة.
+
يمكن إنشاء جدول <code>Hash</code> بسهولة باستخدام شكله الصريح:<syntaxhighlight lang="ruby">
 +
grades = { "Jane Doe" => 10, "Jim Doe" => 6 }
  
يمكن أن تُنشأ Hash بسهولة باستخدام شكلها الضمني:
+
</syntaxhighlight>يسمح الجدول <code>Hash</code> باستعمال [[Ruby/Symbol|الرموز]] كصيغة بديلة للمفاتيح. انظر مثلًا إلى المثال التالي:<syntaxhighlight lang="ruby">
 +
options = { :font_size => 10, :font_family => "Arial" }
  
تسمح التجزئات بصياغة بديلة للمفاتيح التي تكون رموزًا. بدلًا من
+
</syntaxhighlight>و يمكن أن تُكتب أيضًا بالشكل التالي:<syntaxhighlight lang="ruby">
 +
options = { font_size: 10, font_family: "Arial" }
  
و يمكن أن تُكتب:
+
</syntaxhighlight>كل مفتاح مُسمَّى هو [[Ruby/Symbol|رمز]] يمكن الوصول إليه في الجدول <code>Hash</code>:<syntaxhighlight lang="ruby">
 +
options[:font_size]  # => 10
  
كل مفتاح مُسمَّي هو رمز يمكن الوصول إليه في التجزئة:
+
</syntaxhighlight>ويمكن أيضا أن إنشاء جدول <code>Hash</code> من خلال التابع ‎<code>[[Ruby/Hash/new|new]]</code>:<syntaxhighlight lang="ruby">
 +
grades = Hash.new
 +
grades["Dorothy Doe"] = 9
 +
</syntaxhighlight>تملك الجداول <code>Hash</code> قيمةً افتراضيةً تُعاد عند الوصول إلى مفاتيح غير موجودة. إذا لم تُعيَّن قيمة افتراضية، فستُستخدم القيمة <code>nil</code>. ويمكن تعيين القيمة الافتراضية بتمريرها إلى ‎[[Ruby/Hash/new|<code>new</code>]]:<syntaxhighlight lang="ruby">
 +
grades = Hash.new(0)
  
ويمكن أيضا أن تنشأ Hash من خلال التابع ‎::new:
+
</syntaxhighlight>أو باستخدام التابع [[Ruby/Hash/default-3D|<code>default</code>]]:<syntaxhighlight lang="ruby">
 +
grades = {"Timmy Doe" => 8}
 +
grades.default = 0
 +
</syntaxhighlight>يتطلب الوصول إلى قيمة ما في الجدول <code>Hash</code> استخدام مفتاحها:<syntaxhighlight lang="ruby">
 +
puts grades["Jane Doe"] # => 0
  
تتخذ التجزئات قيمة افتراضية تُعاد عند الوصول إلى مفاتيح غير موجودة في التجزئة. إذا لم تتعين قيمة افتراضية تُستخدم nil. ويمكن تعيين القيمة الافتراضية بإرسالها كوسيط إلى ‎::new:
+
</syntaxhighlight>
 +
==استخدامات شائعة==
 +
يعد النوع <code>Hash</code> طريقةً سهلةً لتمثيل هياكل البيانات مثل:<syntaxhighlight lang="ruby">
 +
books        = {}
 +
books[:matz]  = "The Ruby Programming Language"
 +
books[:black] = "The Well-Grounded Rubyist"
  
أو باستخدام التابع default=:
+
</syntaxhighlight>كما يشيع استخدام النوع <code>Hash</code> كطريقة للحصول على [[Ruby/methods#.D8.A7.D9.84.D9.88.D8.B3.D8.A7.D8.A6.D8.B7 .D8.A7.D9.84.D9.85.D8.B3.D9.85.D8.A7.D8.A9|معاملات مسماة]] في الدوال. لاحظ أنَّه لا توجد أقواس مستخدمة في المثال في الأسفل. إذا كان النوع <code>Hash</code> هو الوسيط الأخير في استدعاء [[Ruby/methods|تابع]]، فلا يلزم استخدام أقواس، وبالتالي يمكن إنشاء واجهة مُرتَّبة جدًا:<syntaxhighlight lang="ruby">
 +
Person.create(name: "John Doe", age: 27)
  
يتطلب الوصول إلى قيمة ما في Hash استخدام مفتاحها:
+
def self.create(params)
 +
  @name = params[:name]
 +
  @age  = params[:age]
 +
end
 +
</syntaxhighlight>
 +
==المفاتيح في النوع <code>Hash</code>==
 +
يُشير كائنان إلى نفس المفتاح في الجدول <code>Hash</code> عندما تكون القيمة المرتبطة بأحدهما مماثلة ومساوية للقيمة المرتبطة بالمفتاح الآخر.
  
=== الاستخدامات الشائعة ===
+
قد يُستخدَم صنف معرف من قِبَل المستخدم كمفتاح إذا استُبدِل التابعَيْن <code>[[Ruby/Hash/hash|hash]]</code> و <code>[[Ruby/Hash/eql-3F|eql?]]</code>‎ لتوفير سلوك ذو معنى. بشكل افتراضي، تشير النُسَخ المنفصلة إلى مفاتيح منفصلة.
تُعد التجزئات طريقة سهلة لتمثيل هياكل البيانات، مثل
 
  
كما يشيع استخدام التجزئات كطريقة للحصول على معاملات مسماة في الدوال. لاحظ أنه لا توجد أقواس مستخدمة أدناه. إذا كانت التجزئة هي الوسيط الأخير في استدعاء التابع، لا يلزم استخدام أقواس، وبالتالي إنشاء واجهة مُرتَّبة جدًا:
+
ويستند التنفيذ النموذجي للتابع [[Ruby/Hash/hash|<code>hash</code>]] على بيانات الكائن، بينما يُعين عادةً اسم بديل للتابع <code>[[Ruby/Hash/eql-3F|eql?]]</code>‎ يشير إلى المعامل <code>[[Ruby/Hash/equal|==]]</code> المُستبدَل:<syntaxhighlight lang="ruby">
 +
class Book
 +
  attr_reader :author, :title
  
=== مفاتيح Hash ===
+
  def initialize(author, title)
يُشير كائنان إلى نفس مفتاح التجزئة عندما تكون قيمتا hash الخاصة بهما متطابقة ويكون الكائنان eql?‎ لبعضهم البعض.
+
    @author = author
 +
    @title = title
 +
  end
  
قد يستخدم صنف معرف من قِبَل المستخدم كمفتاح تجزئة إذا أُبطِل التابعَيْن hash و eql?‎ لتوفير سلوك ذو معنى. بشكل افتراضي، تشير المثيلات المنفصلة إلى مفاتيح تجزئة منفصلة.
+
  def ==(other)
 +
    self.class === other and
 +
      other.author == @author and
 +
      other.title == @title
 +
  end
  
ويستند التطبيق النموذجي للتجزئة hash على بيانات الكائن، بينما يُعين عادةً اسم مستعار للتابع eql?‎ يشير إلى التابع المُبطِل ==:
+
  alias eql? ==
  
انظر أيضا Object#hash و Object#eql?‎
+
  def hash
 +
    @author.hash ^ @title.hash # XOR
 +
  end
 +
end
  
=== توابع الصنف العام ===
+
book1 = Book.new 'matz', 'Ruby in a Nutshell'
Hash[ key, value, ... ] → new_hash
+
book2 = Book.new 'matz', 'Ruby in a Nutshell'
  
Hash[ [ [key, value], ... ] ] → new_hash
+
reviews = {}
  
Hash[ object ] → new_hash
+
reviews[book1] = 'Great reference!'
 +
reviews[book2] = 'Nice and compact!'
  
إنشاء تجزئة جديدة ممتلئة بالكائنات المعطاة.
+
reviews.length #=> 1
 +
</syntaxhighlight>انظر أيضًا التابع <code>[[Ruby/Object/hash|Object.hash]]</code> والتابع <code>[[Ruby/Object/eql-3F|Object.eql?]]</code>‎.
 +
==توابع الصنف العام==
 +
===<code>[[Ruby/Hash/index|Hash[]‎]]</code>===
 +
ينشئ جدول <code>Hash</code> جديد ويضع فيه الكائنات المعطاة.
  
على غرار القيمة الحرفية { key => value, ... }. في الشكل الأول، تأتي المفاتيح والقيم في أزواج، لذلك يجب أن يكون هناك عدد زوجي من الوسائط.
+
===<code>[[Ruby/Hash/new|new]]</code>===
 +
ينشئ جدول <code>Hash</code> جديد فارغ ثم يعيده.
  
يُمرر في الشكلين الثاني والثالث وسيطٌ واحدٌ ويكون إما مصفوفة من أزواج القيمة-المفتاح أو كائن قابل للتحويل إلى تجزئة.
+
===<code>[[Ruby/Hash/try_convert|try_convert]]</code>===
 +
يحاول تحويل الكائن المُمرَّر إليه إلى النوع <code>Hash</code> باستخدام التابع<code>[[Ruby/Hash/to hash|to_hash]]</code>. 
  
new → new_hash
+
== توابع النسخة العامة ==
  
new(obj) → new_hash
+
===<code>[[Ruby/Hash/lt|>]]</code>===
 +
يعيد القيمة <code>true</code> إذا كان الكائن <code>Hash</code> الواقع على يساره مجموعةً فرعيةً من الكائن الواقع على يمينه.
  
new {|hash, key| block } → new_hash
+
===<code>[[Ruby/Hash/le|=>]]</code>===
 +
يعيد القيمة <code>true</code> إذا كان الكائن <code>Hash</code> الواقع على يساره مجموعةً فرعيةً من الكائن الواقع على يمينه أو يساويه تمامًا.
  
إعادة تجزئة جديدة فارغة. إذا وصل بعد ذلك مفتاحٌ لا يتوافق مع إدخال تجزئة إلى هذه التجزئة، تعتمد القيمة المُعادة على نمط new يستخدم لإنشاء التجزئة. في الشكل الأول، يُعيد الوصول nil. إذا حُدِد obj ، سيُستخدم هذا الكائن وحده لكافة القيم الافتراضية. إذا حُدِدت كتلة، ستُستدعى مع كائن التجزئة والمفتاح، و يجب إعادة القيمة الافتراضية. ومن مسؤولية الكتلة تخزين القيمة في التجزئة إذا لزم الأمر.
+
===<code>[[Ruby/Hash/equal|==]]</code>===
 +
يتحقق من تساوي كائنين من النوع <code>Hash</code>.
  
try_convert(obj) → hash or nil
+
===<code>[[Ruby/Hash/gt|<]]</code>===
 +
يعيد القيمة <code>true</code> إذا كان الكائن الواقع على يمينه مجموعةً فرعيةً من الكائن الواقع على يساره.
  
محاولة تحويل obj إلى تجزئة باستخدام التابع ‎#to_hash. إعادة التجزئة المُحوَّلة أو nil إذا تعذر تحويل obj لأي سبب.
+
===<code>[[Ruby/Hash/ge|=<]]</code>===
 +
يعيد المعامل <code>=<</code> القيمة <code>true</code> إذا كان الكائن الواقع على يمينه مجموعةً فرعيةً من الكائن الواقع على يساره أو يساويه تمامًا.
  
=== توابع المثيل العام ===
+
===<code>[[Ruby/Hash/5B-5D|[]]]</code>===
hash < other → true or false
+
يجلب القيمة المقابلة لمفتاح معين في الجدول <code>Hash</code> المعطى.
  
يُعيد true إذا كانت hash مجموعة فرعية من other.
+
===<code>[[Ruby/Hash/5B-5D-3D|=[]]]</code>===
 +
يربط عند استدعائه بالشكل <code>hsh[key] = value</code> القيمة <code>value</code> المعطاة بالمفتاح<code>key</code> في الجدول <code>Hash</code>.
  
hash <= other → true or false
+
===<code>[[Ruby/Hash/any-3F|any?‎]]</code>===
 +
يمرر كل زوج من مفتاح/قيمة من أزواج الكائن <code>[[Ruby/Hash|Hash]]</code> المعطى إلى كتلة معينة ثم يعيد القيمة <code>true</code> إن أعادت الكتلة قيمة غير القيمة <code>false</code> أو <code>nil</code>.
  
إعادة true إذا كانت hash مجموعة فرعية من other أو تساوي other.
+
===<code>[[Ruby/Hash/assoc|assoc]]</code>===
 +
يبحث ضمن الكائن <code>[[Ruby/Hash|Hash]]</code> عن طريق موازنة الكائن المُمرَّر إليه بمفاتيحه باستخدام المعامل <code>[[Ruby/Hash/equal|==]]</code> ثم يعيد الزوج قيمة-مفتاح (مصفوفة من عنصرين) أو <code>nil</code> إذا لم يعثر على أي تطابق.
  
hsh == other_hash → true or false
+
===<code>[[Ruby/Hash/clear|clear]]</code>===
 +
يزيل جميع الأزواج قيمة-مفتاح من الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه.
  
المساواة--تتساوى تجزئتان إذا كان كل منهما يحتوي على نفس العدد من المفاتيح وإذا كان كل زوج القيمة-المفتاح يساوي (وفقًا Object#==) العناصر المناظرة في التجزئة الأخرى.
+
===<code>[[Ruby/Hash/compact|compact]]</code>===
 +
يعيد كائن <code>Hash</code> جديد يحوي جميع الأزواج قيم/مفاتيح للكائن الذي استدعي معه باستثناء الأزواج المعدومة (أي ذات القيمة <code>nil</code>).
  
لا يقارن ترتيب كل التجزئات.
+
===<code>[[Ruby/Hash/compact!|compact!]]</code>===
 +
يزيل جميع الأزواج قيمة/مفتاح المعدومة (أي ذات القيمة <code>nil</code>) من الكائن الذي استدعي معه.
  
hash > other → true or false
+
===<code>[[Ruby/Hash/compare_by_identity|compare_by_identity]]</code>===
 +
يجعل الكائن <code>[[Ruby/Hash|Hash]]</code> يقارن مفاتيحه بواسطة مُعرِّفاتها، أي أنَّها سوف تُعدُّ نفس الكائنات على أنَّها نفس المفاتيح.
  
إعادة true إذا كان other مجموعة فرعية من hash.
+
===<code>[[Ruby/Hash/compare_by_identity-3F|compare_by_identity?‎]]</code>===
 +
يتحقق إذا كان الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه سيقارن مفاتيحه بواسطة مُعرِّفاتهم.
  
hash >= other → true or false
+
===<code>[[Ruby/Hash/default|default]]</code>===
 +
يعيد القيمة الافتراضية للمفتاح المُمرَّر إليه؛ أي يعيد القيمة التي سيعيدها الكائن<code>[[Ruby/Hash|Hash]]</code> إذا كان المفتاح غير موجود فيه.
  
إعادة true إذا كان other مجموعة فرعية من hash أو يساوي hash.
+
===[[Ruby/Hash/default-3D|<code rel="mw:WikiLink" href="Ruby/Hash/default-3D" title="Ruby/Hash/default-3D">=default</code>]]===
 +
يضبط عند استدعائه بالشكل <code>default = obj</code> القيمة الافتراضية <code>obj</code> وهي القيمة التي ستُعاد لمفتاح غير موجود في الكائن <code>[[Ruby/Hash|Hash]]</code>.
  
hsh[key] → value
+
===<code>[[Ruby/Hash/default_proc|default_proc]]</code>===
 +
يعيد الكتلة التي استُدعي التابع <code>[[Ruby/Hash/new|new]]</code> معها عند إنشاء الكائن <code>[[Ruby/Hash|Hash]]</code>المعطى، وإلا سيُعيد القيمة <code>nil</code>.
  
مرجع العنصر — يسترد كائن value المقابل لكائن key. إذا لم يُعثر عليه، تُعيد القيمة الافتراضية (راجع Hash::new لمزيد من التفاصيل).
+
===<code>[[Ruby/Hash/default_proc-3D|=default_proc]]</code>===
 +
يضبط إن استدعي بالشكل <code>default_proc = proc_obj</code> القيمة الافتراضية للكتلة التي ستُنفَّذ عند فشل أية عملية بحث عن مفتاح للكائن <code>[[Ruby/Hash|Hash]]</code> المعطى.
  
hsh[key] = value → value
+
===<code>[[Ruby/Hash/delete|delete]]</code>===
 +
يحذف زوجًا ذا مفتاح محدَّد ويعيد قيمته من الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه.
  
== تعيين عنصر ==
+
===<code>[[Ruby/Hash/delete_if|delete_if]]</code>===
يربط القيمة value المُعطاة مع المفتاح key المُعطي.
+
يحذف كل زوج قيمة-مفتاح يحقق شرطًا معيَّنًا من أزواج الكائن <code>[[Ruby/Hash|Hash]]</code> المعطى.
  
لا يجب تغيير قيمة key أثناء استخدامه كمفتاح (ستكرر السلاسل غير المجمدة unfrozen المُمررة كمفتاح وتُجمَّد).
+
===<code>[[Ruby/Hash/dig|dig]]</code>===
 +
يستخرج القيمة المتداخلة المحددة بواسطة تسلسل كائنات تمثِّل المفاتيح عن طريق استدعاء <code>dig</code> في كل خطوة، ويعيد القيمة <code>nil</code> إذا كانت أي خطوة متوسطة هي <code>nil</code>.
  
any? [{ |(key, value)| block }] → true or false
+
===<code>[[Ruby/Hash/each|each]]</code>===
 +
يستدعي الكتلة المعطاة مرةً واحدةً لكل مفتاح من مفاتيح أزواج الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه بعد تمرير مفتاح وقيمة الأزواج إليها.
  
راجع أيضًا Enumerable#any?‎
+
===<code>[[Ruby/Hash/each_key|each_key]]</code>===
 +
يستدعي الكتلة المعطاة مرةً واحدةً لكل مفتاح من مفاتيح أزواج الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه بعد تمرير مفتاح كل زوج إليها.
  
assoc(obj) → an_array or nil
+
===<code>[[Ruby/Hash/each_pair|each_pair]]</code>===
 +
يستدعي الكتلة المعطاة مرةً واحدةً لكل مفتاح من مفاتيح أزواج الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه بعد تمرير مفتاح وقيمة الأزواج إليها.
  
البحث خلال التجزئة عن طريق مقارنة obj بالمفتاح باستخدام ==. يعيد زوج القيمة-االمفتاح (مصفوفة من عنصرين) أو nil إذا لم يعثر على أي تطابق. راجع Array#assoc.
+
===<code>[[Ruby/Hash/each_value|each_value]]</code>===
 +
يستدعي الكتلة المعطاة مرةً واحدةً لكل مفتاح من مفاتيح أزواج الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه بعد تمرير قيمة كل زوج إليها.
  
clear → hsh
+
===<code>[[Ruby/Hash/empty-3F|empty?‎]]</code>===
 +
يتحقق إذا كان الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه فارغًا أي لا يحتوي على أية أزواج.
  
يزيل جميع أزواج القيمة-المفتاح من hsh.
+
===<code>[[Ruby/Hash/eql-3F|eql?‎]]</code>===
 +
يتحقق إذا كان كائنان من نفس النوع (النوع <code>[[Ruby/Hash|Hash]]</code>) ولهما نفس المحتوى. لا يؤخذ ترتيب الأزواج بالحسبان.
  
compact → new_hash
+
===<code>[[Ruby/Hash/fetch|fetch]]</code>===
 +
يعيد قيمة من الكائن <code>[[Ruby/Hash|Hash]]</code> لمفتاح معين.
  
يُعيد تجزئة جديدة مع إزالة أزواج القيم/المفاتيح الصفرية
+
===<code>[[Ruby/Hash/fetch_values|fetch_values]]</code>===
 +
يعيد مصفوفة تحتوي على القيم المقترنة بالمفاتيح المعطاة.
  
compact! → hsh or nil
+
===<code>[[Ruby/Hash/flatten|flatten]]</code>===
 +
يعيد مصفوفة جديدة والتي تكون تسطيح أحادي الأبعاد للكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه.
  
يزيل جميع قيم hsh من التجزئة. إعادة صفر إذا لم يُجرى أية تغييرات، وإلا يُعيد التجزئة.
+
===<code>[[Ruby/Hash/has_key-3F|has_key?‎]]</code>===
 +
يتحقق إذا كان مفتاحٌ معيَّن موجودًا في الكائن <code>[[Ruby/Hash|Hash]]</code> المعطى.
  
compare_by_identity → hsh
+
===<code>[[Ruby/Hash/has_value-3F|has_value?‎]]</code>===
 +
يعيد إذا كانت قيمةٌ معيَّنةٌ موجودةً في الكائن <code>[[Ruby/Hash|Hash]]</code> المعطى ومرتبطة بمفتاح.
  
يجعل hsh يقارن مفاتيحه بواسطة مُعرِّفه، أي إنها سوف تعتبر نفس الكائنات على أنها نفس المفاتيح.
+
===<code>[[Ruby/Hash/hash|hash]]</code>===
 +
يحسب الشيفرة hash للكائن <code>[[Ruby/Hash|Hash]]</code> المستدعى معها.
  
compare_by_identity? → true or false
+
===<code>[[Ruby/Hash/include-3F|include?‎]]</code>===
 +
يعيد إذا كان مفتاحٌ معيَّن موجودًا في الكائن <code>[[Ruby/Hash|Hash]]</code> المعطى.
  
إعادة true إذا كانت hsh ستقارن مفاتيحها بواسطة مُعرِّفهم. راجع أيضا Hash#compare_by_identity.
+
===<code>[[Ruby/Hash/inspect|inspect]]</code>===
 +
يعيد محتوى الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه في سلسلة نصية.
  
default(key=nil) → obj
+
===<code>[[Ruby/Hash/invert|invert]]</code>===
 +
يعيد كائن جديد من النوع <code>[[Ruby/Hash|Hash]]</code> يحوي قيم الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه كمفاتيح ومفاتيحه كقيم فيه.
  
إعادة القيمة الافتراضية، القيمة مُعادة بواسطة hsh إذا كان key غير موجود في hsh. راجع أيضًا Hash::new and Hash#default=‎.
+
===<code>[[Ruby/Hash/keep_if|keep_if]]</code>===
 +
يبقي كل زوج قيمة-مفتاح يحقق شرطًا معيَّنًا من أزواج الكائن <code>[[Ruby/Hash|Hash]]</code> المعطى.
  
default = obj → obj
+
===<code>[[Ruby/Hash/key|key]]</code>===
 +
يعيد المفتاح المقابل لقيمة معيَّنة في الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه.
  
تعيين القيمة الافتراضية، القيمة المُعادة لمفتاح غير موجود في التجزئة. ليس من الممكن ضب القيمة الافتراضية على Proc التي ستنفذ على كل بحث عن مفتاح.
+
===<code>[[Ruby/Hash/key-3F|key?‎]]</code>===
 +
يتحقق إذا كان مفتاحٌ محدَّدٌ موجودًا في الكائن <code>[[Ruby/Hash|Hash]]</code> المستدعى معه.
  
default_proc → anObject
+
===<code>[[Ruby/Hash/keys|keys]]</code>===
 +
يعيد مصفوفة جديدة تحوي مفاتيح الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه.
  
إذا استُدعي Hash::new مع كتلة، سيُعيد هذه الكتلة، وإلا سيُعيد nil.
+
===<code>[[Ruby/Hash/length|length]]</code>===
 +
يعيد عدد الأزواج قيمة-مفتاح الموجودة في الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه.
  
default_proc = proc_obj أو صفر
+
===<code>[[Ruby/Hash/member-3F|member?‎]]</code>===
 +
يتحقق إذا كان مفتاحٌ معيَّن موجودًا في الكائن <code>[[Ruby/Hash|Hash]]</code> المعطى.
  
تعيين proc الافتراضية التي ستُنفَّذ عند فشل أي بحث عن مفتاح.
+
===<code>[[Ruby/Hash/merge|merge]]</code>===
 +
يدمج كائنين من النوع <code>[[Ruby/Hash|Hash]]</code> مع بعضهما بعضًا في كائن جديد من النوع <code>[[Ruby/Hash|Hash]]</code> ثم يعيده.
  
delete(key) → value
+
===<code>[[Ruby/Hash/merge!|merge!‎]]</code>===
 +
يضيف محتويات الكائن <code>[[Ruby/Hash|Hash]]</code> الذي مُمرِّر إليه إلى الكائن الذي استدعي معه.
  
delete(key) {| key | block } → value
+
===<code>[[Ruby/Hash/rassoc|rassoc]]</code>===
 +
يبحث خلال الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه عن طريق مقارنة القيمة التي مُمرِّرت إليه مع قيم ذلك الكائن باستخدام المعامل <code>[[Ruby/Hash/equal|==]]</code> ثم يعيد أول زوج قيمة-مفتاح متطابق.
  
حذف زوج القيمة-المفتاح وإعادة القيمة من hsh والذي يكون مفتاحها key. ويُعيد nil إذا كان المفتاح غير موجود. إذا توفرت كتلة الشيفرة البرمجية الاختيارية وكان المفتاح غير موجود، يُمرر المفتاح وتُعاد نتيجة block.
+
===<code>[[Ruby/Hash/rehash|rehash]]</code>===
 +
يعيد بناء الكائن <code>[[Ruby/Hash|Hash]]</code> استنادًا إلى القيم الحالية لكل مفتاح.
  
delete_if {| key, value | block } → hsh
+
===<code>[[Ruby/Hash/reject|reject]]</code>===
 +
يعيد كائن جديد من النوع <code>[[Ruby/Hash|Hash]]</code> يتكون من الأزواج التي ترفضها الكتلة المعطاة.
  
delete_if → an_enumerator
+
===<code>[[Ruby/Hash/reject!|reject!‎]]</code>===
 +
يحذف الأزواج التي ترفضها الكتلة المعطاة من الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه. 
  
حذف كل أزواج القيمة-المفتاح من hsh التي تُقيَّم لها block بالقيمة true.
+
===<code>[[Ruby/Hash/replace|replace]]</code>===
 +
يُبدِّل محتويات الكائن المُمرَّر إليه مكان محتويات الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه.
  
إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك.
+
===<code>[[Ruby/Hash/select|select]]</code>===
 +
يعيد كائن جديد من النوع <code>[[Ruby/Hash|Hash]]</code> يتكون من العناصر التي تعيد الكتلة المعطاة معها القيمة <code>true</code>.
  
dig(key, ...) → object
+
===<code>[[Ruby/Hash/select!|select!‎]]</code>===
 +
يحذف الأزواج التي تقبلها الكتلة المعطاة من الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه. 
  
استخراج القيمة المتداخلة المحددة بواسطة تسلسل كائنات key عن طريق استدعاء dig في كل خطوة، وإعادة nil إذا كانت أي خطوة متوسطة nil.
+
===<code>[[Ruby/Hash/shift|shift]]</code>===
 +
يزيل زوجًا من قيمة-مفتاح من الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه ويعيده في مصفوفة، أو يعيد القيمة الافتراضية لهذا الكائن إذا كان فارغًا.
  
each {| key, value | block } → hsh
+
===<code>[[Ruby/Hash/size|size]]</code>===
 +
يعيد عدد الأزواج القيمة-المفتاح الموجودة في الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه.
  
each_pair {| key, value | block } → hsh
+
===<code>[[Ruby/Hash/slice|slice]]</code>===
 +
يعيد كائنًا من النوع <code>[[Ruby/Hash|Hash]]</code> يحتوي فقط على مفاتيح محدَّدة وقيمها.
  
each → an_enumerator
+
===<code>[[Ruby/Hash/store|store]]</code>===
 +
يربط قيمة محددة مع مفتاح محدد في الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه.
  
each_pair → an_enumerator
+
===<code>[[Ruby/Hash/to_a|to_a]]</code>===
 +
يحول الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه إلى مصفوفة متشعبة من المصفوفات <code>[ key, value ]</code>.
  
استدعاء block مرة واحدة لكل مفتاح في hsh، وتمرير زوج القيمة-المفتاح كمعاملات.
+
===<code>[[Ruby/Hash/to_h|to_h]]</code>===
 +
يعيد الكائن [[Ruby/Hash|<code>Hash</code>]] المعطى نفسه. إذا استُدعي على صنف فرعي من <code>[[Ruby/Hash|Hash]]</code>، فستحوِّل المستقبل إلى كائن من النوع <code>[[Ruby/Hash|Hash]]</code>.
  
إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك.
+
===<code>[[Ruby/Hash/to_hash|to_hash]]</code>===
 +
يعيد الكائن [[Ruby/Hash|<code>Hash</code>]] المعطى نفسه.
  
يُنتِج:
+
===<code>[[Ruby/Hash/to_proc|to_proc]]</code>===
 +
===<code>[[Ruby/Hash/to_s|to_s]]</code>===
 +
يعيد محتوى الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه في سلسلة نصية.
  
each_key {| key | block } → hsh
+
===<code>[[Ruby/Hash/transform_keys|transform_keys]]</code>===
 +
يعيد كائن جديد من النوع <code>[[Ruby/Hash|Hash]]</code> مع ناتج تنفيذ الكتلة المعطاة مرةً واحدةً لكل مفتاح من مفاتيح الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه.
  
each_key → an_enumerator
+
===<code>[[Ruby/Hash/transform_keys!|transform_keys!‎]]</code>===
 +
يستدعي الكتلة المعطاة مرةً واحدةً لكل مفتاح من مفاتيح الكائن [[Ruby/Hash|<code>Hash</code>]] المعطى، ويستبدل به المفتاح الجديد الذي تعيده الكتلة، ثم يعيد هذا الكائن.
  
استدعاء block مرة واحدة لكل مفتاح في hsh، وتمرير المفتاح كمعامل.
+
===<code>[[Ruby/Hash/transform_values|transform_values]]</code>===
 +
يعيد كائن جديد من النوع <code>[[Ruby/Hash|Hash]]</code> مع ناتج تنفيذ الكتلة المعطاة مرةً واحدةً لكل قيمة من قيم الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه.
  
إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك.
+
===<code>[[Ruby/Hash/transform_values!|transform_values!‎]]</code>===
 +
يستدعي الكتلة المعطاة مرةً واحدةً لكل قيمة من قيم الكائن [[Ruby/Hash|<code>Hash</code>]] المعطى، ويستبدل به القيمة الجديد التي تعيدها الكتلة، ثم يعيد هذا الكائن. لا يُغيّر هذا التابع المفاتيح.
  
يُنتِج:
+
===<code>[[Ruby/Hash/update|update]]</code>===
 +
يضيف محتويات الكائن المُمرَّر إليه إلى الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه.
  
each_pair {| key, value | block } → hsh
+
===<code>[[Ruby/Hash/value-3F|value?‎]]</code>===
 +
يتحقق إذا كانت القيمة المُمرَّرة إليه موجودةً ومرتبطةً بمفتاح ما في الكائن <code>[[Ruby/Hash|Hash]]</code> المعطى.
  
each_pair → an_enumerator
+
===<code>[[Ruby/Hash/values|values]]</code>===
 +
يعيد مصفوفة جديدة تحوي قيم الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه.
  
استدعاء block مرة واحدة لكل مفتاح في hsh، وتمرير زوج القيمة-المفتاح كمعاملات.
+
===<code>[[Ruby/Hash/values_at|values_at]]</code>===
 +
يعيد مصفوفةً تحتوي على القيم المرتبطة بمفاتيح محدَّدة من الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه.
  
إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك.
+
== ملاحظات إضافية ==
 +
تأتي بعض التوابع التي يستخدمها البعض مع الكائن <code>Hash</code> من الوحدة <code>[[Ruby/Enumerable|Enumerable]]</code>.
  
يُنتِج:
+
إذا لم تعثر على ما تبحث عنه في هذا التوثيق، فاطلع على توثيق <code>[[Ruby/Enumerable|Enumerable]]</code>.
  
each_value {| value | block } → hsh
+
=مصادر=
 
+
* <span> </span>[http://ruby-doc.org/core-2.5.1/Hash.html صفحة الصنف Hash في توثيق روبي الرسمي.]
each_value → an_enumerator
 
 
 
استدعاء block مرة واحدة لكل مفتاح في hsh، وتمرير المفتاح كمعامل.
 
 
 
إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك.
 
 
 
يُنتِج:
 
 
 
empty? → true or false
 
 
 
إعادة true إذا كانت hsh لا تحتوي على أزواج القيمة-المفتاح.
 
 
 
eql?(other) → true or false
 
 
 
إعادة true إذا كان كلٌ من hash و other تجزئتين بنفس المحتوى. لا يقارن ترتيب كل التجزئات.
 
 
 
fetch(key [, default] ) → obj
 
 
 
fetch(key) {| key | block } → obj
 
 
 
إعادة قيمة من التجزئة لمفتاح معين. إذا كان المفتاح غير موجود، هناك عدة خيارات: مع عدم وجود وسائط أخرى، سيُجرى استثناء KeyError، إذا أُعطيَ default، ستُعاد هذه إذا حُدِدت كتلة الشيفرة البرمجية الاختيارية، ثم ستُنفَّذ وتُعاد نتيجتها.
 
 
 
يُظهِر المثال التالي إجراء استثناء إذا كان المفتاح غير موجود ولم تُعطى قيمة افتراضية.
 
 
 
يُنتِج:
 
 
 
fetch_values(key, ...) → array
 
 
 
fetch_values(key, ...) { |key| block } → array
 
 
 
إعادة مصفوفة تحتوي على القيم المقترنة بالمفاتيح المعطاة ولكن تُجرى أيضًا KeyError عند تعذر العثور على أحد المفاتيح. راجع أيضًا Hash#values_at و Hash#fetch.
 
 
 
flatten → an_array
 
 
 
flatten(level) → an_array
 
 
 
إعادة مصفوفة جديدة والتي تكون تسطيح أحادي الأبعاد لهذا التجزئة. أي أن لكل مفتاح أو قيمة تكون مصفوفة، تستخرج عناصرها إلى مصفوفة جديدة. على عكس Array#flatten، لا يُسطِّح هذا التابع بشكل عَودي افتراضيًا. يُحدد الوسيط الاختياري level مستوى عودية التسطح.
 
 
 
has_key?(key) → true or false
 
 
 
إعادة true إذا كان مفتاح معين موجود في hsh.
 
 
 
علمًا بأن include?‎ و member?‎ لا يختبرا تساوي الأعضاء باستخدام == كما تفعل غيرها من العدَّادات.
 
 
 
راجع أيضًا Enumerable#include?‎
 
 
 
has_value?(value) → true or false
 
 
 
إعادة true إذا كانت القيمة المُعطاة موجودة لمفتاح ما في hsh.
 
 
 
hash → integer
 
 
 
حساب رمز التجزئة لهذه التجزئة. سيكون لتجزئتين لهما نفس المحتوى نفس رمز التجزئة (وستقارن باستخدام eql?‎).
 
 
 
راجع أيضًا Object#hash.
 
 
 
include?(key) → true or false
 
 
 
إعادة true إذا كان مفتاح معين موجود في hsh.
 
 
 
علمًا بأن include?‎ و member?‎ لا يختبرا تساوي الأعضاء باستخدام == كما تفعل غيرها من العدَّادات.
 
 
 
راجع أيضًا Enumerable#include?‎
 
 
 
to_s → string
 
 
 
inspect → string
 
 
 
إعادة محتويات هذا التجزئة كسلسلة نصية.
 
 
 
ويُعيَّن له أيضًا الاسم المستعار: to_s.
 
 
 
invert → new_hash
 
 
 
إعادة تجزئة جديدة مُنشأة باستخدام قيم hsh كمفاتيح والمفاتيح كقيم. إذا وُجِد بالفعل مفتاح بنفس القيمة في hsh، سيستخدم آخر واحد مُعرَّف، وستُتجاهل القيم السابقة.
 
 
 
إذا لم يكن هناك مفتاح بنفس القيمة، تكون #invert ذاتية الانعكاس (involutive).
 
 
 
الشرط، ألا يوجد مفتاح بنفس القيمة، ويمكن اختباره بمقارنة حجم التجزئة المقلوبة.
 
 
 
keep_if {| key, value | block } → hsh
 
 
 
keep_if → an_enumerator
 
 
 
حذف كل أزواج القيمة-المفتاح من hsh والتي تقيَّم لها block بالقيمة false.
 
 
 
إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك.
 
 
 
key(value) → key
 
 
 
إعادة مفتاح تواجد قيمة معينة. ويُعيد nil إذا كانت القيمة غير موجود.
 
 
 
key?(key) → true or false
 
 
 
إعادة true إذا كان مفتاح معين موجود في hsh.
 
 
 
علمًا بأن include?‎ و member?‎ لا يختبرا تساوي الأعضاء باستخدام == كما تفعل غيرها من العدَّادات.
 
 
 
راجع أيضًا Enumerable#include?‎
 
 
 
keys → array
 
 
 
إعادة مصفوفة جديدة ممتلئة بالمفاتيح من هذه التجزئة. راجع أيضًا Hash#values.
 
 
 
length → integer
 
 
 
إعادة عدد أزواج القيمة-المفتاح في التجزئة.
 
 
 
member?(key) → true or false
 
 
 
إعادة true إذا كان مفتاح معين موجود في hsh.
 
 
 
علمًا بأن include?‎ و member?‎ لا يختبرا تساوي الأعضاء باستخدام == كما تفعل غيرها من العدَّادات.
 
 
 
راجع أيضًا Enumerable#include?‎
 
 
 
merge(other_hash) → new_hash
 
 
 
merge(other_hash){|key, oldval, newval| block} → new_hash
 
 
 
إعادة تجزئة جديدة تحتوي على محتويات other_hash ومحتويات hsh. إذا لم تُحدد أي كتلة، ستكون قيمة العناصر ذات المفاتيح المُكررة هي نفسها من other_hash. وإلا تُحدَد قيمة كل مفتاح مكرر عن طريق استدعاء الكتلة مع المفتاح، وتكون قيمته في hsh وقيمته في other_hash.
 
 
 
merge!(other_hash) → hsh
 
 
 
merge!(other_hash){|key, oldval, newval| block} → hsh
 
 
 
إضافة محتويات other_hash إلى hsh. إذا لم تُحدَد أي كتلة، يُكتب فوق الإدخالات ذات المفاتيح المكررة مع القيم من other_hash، وإلا تُحدَّد قيمة كل مفتاح مكرر عن طريق استدعاء الكتلة مع المفتاح وقيمته في hsh وقيمته في other_hash.
 
 
 
rassoc(obj) → an_array or nil
 
 
 
البحث خلال التجزئة عن طريق مقارنة obj بالقيمة باستخدام ==. إعادة أول زوج القيمة-المفتاح (مصفوفة من عنصرين) يتطابق. راجع أيضًا Array#rassoc.
 
 
 
rehash → hsh
 
 
 
إعادة بناء التجزئة استنادًا إلى قيم التجزئة الحالية لكل مفتاح. إذا تغيرت قيم كائنات المفاتيح منذ إدراجها، سيعيد هذا التابع فهرسة hsh. إذا اُستدعيَ Hash#rehash بينما يجتاز مُكرِّر التجزئة، سينطلق RuntimeError في المُكرِّر.
 
 
 
reject {|key, value| block} → a_hash
 
 
 
reject → an_enumerator
 
 
 
إعادة تجزئة جديدة تتكون من العناصر التي تعيد الكتلة لها false.
 
 
 
إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك.
 
 
 
reject! {| key, value | block } → hsh or nil
 
 
 
reject! → an_enumerator
 
 
 
يعادل Hash#delete_if، ولكن يُعيد nil إذا لم تُجرى أية تغييرات.
 
 
 
replace(other_hash) → hsh
 
 
 
استبدال محتويات hsh بمحتويات other_hash.
 
 
 
select {|key, value| block} → a_hash
 
 
 
select → an_enumerator
 
 
 
إعادة تجزئة جديدة تتكون من العناصر التي تعيد الكتلة لها true.
 
 
 
إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك.
 
 
 
select! {| key, value | block } → hsh or nil
 
 
 
select! → an_enumerator
 
 
 
يعادل Hash#keep_if، ولكن يُعيد nil إذا لم تُجرى أية تغييرات.
 
 
 
shift → anArray or obj
 
 
 
يزيل زوج القيمة-المفتاح من hsh ويقوم بإعادتها كمصفوفة من العنصرين [ key, value ]، أو القيمة الافتراضية للتجزئة إذا كانت التجزئة فارغة.
 
 
 
size → integer
 
 
 
إعادة عدد أزواج القيمة-المفتاح في التجزئة.
 
 
 
slice(*keys) → a_hash
 
 
 
إعادة تجزئة تحتوي فقط على المفاتيح المُعطاة وقيمها.
 
 
 
store(key, value) → value
 
 
 
== تعيين عنصر ==
 
يربط القيمة value المُعطاة مع المفتاح key المُعطي.
 
 
 
لا يجب تغيير قيمة key أثناء استخدامه كمفتاح (ستكرر السلاسل غير المجمدة unfrozen المُمررة كمفتاح وتُجمَّد).
 
 
 
to_a → array
 
 
 
تحويل hsh إلى مصفوفة متداخلة من المصفوفات [ key, value ].
 
 
 
to_h → hsh or new_hash
 
 
 
إعادة self. إذا استُدعي علي صنف فرعي من Hash، تحوِّل المُتلقي إلى كائن Hash.
 
 
 
to_hash => hsh
 
 
 
إعادة self.
 
 
 
to_proc()‎
 
 
 
to_s()‎
 
 
 
اسم المستعار لـ inspect
 
 
 
transform_keys {|key| block } → new_hash
 
 
 
transform_keys → an_enumerator
 
 
 
إعادة تجزئة جديدة مع نتائج تشغيل الكتلة مرة واحدة لكل مفتاح. لا يُغيّر هذا التابع القيم.
 
 
 
إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك.
 
 
 
transform_keys! {|key| block } → hsh
 
 
 
transform_keys! → an_enumerator
 
 
 
استدعاء الكتلة المعطاة مرة واحدة لكل مفتاح في hsh، واستبداله بالمفتاح الجديد الذي تعيده الكتلة، ثم تُعيد hsh. لا يُغيّر هذا التابع القيم.
 
 
 
إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك.
 
 
 
transform_values {|value| block } → new_hash
 
 
 
transform_values → an_enumerator
 
 
 
إعادة تجزئة جديدة مع نتائج تشغيل الكتلة مرة واحدة لكل قيمة. لا يُغيّر هذا التابع المفاتيح.
 
 
 
إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك.
 
 
 
transform_values! {|value| block } → hsh
 
 
 
transform_values! → an_enumerator
 
 
 
استدعاء الكتلة المعطاة مرة واحدة لكل قيمة في hsh، واستبداله بالقيمة الجديدة التي تعيدها الكتلة، ثم تُعيد hsh. لا يُغيّر هذا التابع المفاتيح.
 
 
 
إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك.
 
 
 
update(other_hash) → hsh
 
 
 
update(other_hash){|key, oldval, newval| block} → hsh
 
 
 
إضافة محتويات other_hash إلى hsh. إذا لم تُحدَد أي كتلة، يُكتب فوق الإدخالات ذات المفاتيح المكررة مع القيم من other_hash، وإلا تُحدَّد قيمة كل مفتاح مكرر عن طريق استدعاء الكتلة مع المفتاح وقيمته في hsh وقيمته في other_hash.
 
 
 
value?(value) → true or false
 
 
 
إعادة true إذا كانت القيمة المُعطاة موجودة لمفتاح ما في hsh.
 
 
 
values → array
 
 
 
إعادة مصفوفة جديدة ممتلئة بالقيم من hsh. راجع أيضًا Hash#keys.
 
 
 
values_at(key, ...) → arrayclick to toggle source
 
 
 
إعادة مصفوفة تحتوي على القيم المرتبطة بالمفاتيح المُعطاة. راجع أيضًا Hash.select.
 
 
 
= مصادر =
 
* صفحة Hash في توثيق روبي الرسمي.
 
 
[[تصنيف:Ruby]]
 
[[تصنيف:Ruby]]
 +
[[تصنيف:Ruby Class]]
 +
[[تصنيف:Ruby Hash]]

المراجعة الحالية بتاريخ 07:32، 13 يناير 2019

النوع Hash (أو الجدول Hash كما يطلق عليه أحيانًا) هو مجموعة تشبه القاموس ويتكون من مفاتيح فريدة وقيم مرتبطة بها. كما يسمى أيضًا المصفوفات الترابطية، فهو يشبه المصفوفات، ولكن بينما تستخدم المصفوفة فقط الأعداد الصحيحة كفهرس، يسمح النوع Hash باستخدام أيٍّ من أنواع الكائنات لاستعمالها كفهرس وربطها بقيمٍ.

ترتَّب وتحصى القيم في النوع Hash بنفس الترتيب الذي أُدرِجت فيه مفاتيحها المقابلة.

يمكن إنشاء جدول Hash بسهولة باستخدام شكله الصريح:

grades = { "Jane Doe" => 10, "Jim Doe" => 6 }

يسمح الجدول Hash باستعمال الرموز كصيغة بديلة للمفاتيح. انظر مثلًا إلى المثال التالي:

options = { :font_size => 10, :font_family => "Arial" }

و يمكن أن تُكتب أيضًا بالشكل التالي:

options = { font_size: 10, font_family: "Arial" }

كل مفتاح مُسمَّى هو رمز يمكن الوصول إليه في الجدول Hash:

options[:font_size]  # => 10

ويمكن أيضا أن إنشاء جدول Hash من خلال التابع ‎new:

grades = Hash.new
grades["Dorothy Doe"] = 9

تملك الجداول Hash قيمةً افتراضيةً تُعاد عند الوصول إلى مفاتيح غير موجودة. إذا لم تُعيَّن قيمة افتراضية، فستُستخدم القيمة nil. ويمكن تعيين القيمة الافتراضية بتمريرها إلى new:

grades = Hash.new(0)

أو باستخدام التابع default:

grades = {"Timmy Doe" => 8}
grades.default = 0

يتطلب الوصول إلى قيمة ما في الجدول Hash استخدام مفتاحها:

puts grades["Jane Doe"] # => 0

استخدامات شائعة

يعد النوع Hash طريقةً سهلةً لتمثيل هياكل البيانات مثل:

books         = {}
books[:matz]  = "The Ruby Programming Language"
books[:black] = "The Well-Grounded Rubyist"

كما يشيع استخدام النوع Hash كطريقة للحصول على معاملات مسماة في الدوال. لاحظ أنَّه لا توجد أقواس مستخدمة في المثال في الأسفل. إذا كان النوع Hash هو الوسيط الأخير في استدعاء تابع، فلا يلزم استخدام أقواس، وبالتالي يمكن إنشاء واجهة مُرتَّبة جدًا:

Person.create(name: "John Doe", age: 27)

def self.create(params)
  @name = params[:name]
  @age  = params[:age]
end

المفاتيح في النوع Hash

يُشير كائنان إلى نفس المفتاح في الجدول Hash عندما تكون القيمة المرتبطة بأحدهما مماثلة ومساوية للقيمة المرتبطة بالمفتاح الآخر.

قد يُستخدَم صنف معرف من قِبَل المستخدم كمفتاح إذا استُبدِل التابعَيْن hash و eql?‎ لتوفير سلوك ذو معنى. بشكل افتراضي، تشير النُسَخ المنفصلة إلى مفاتيح منفصلة.

ويستند التنفيذ النموذجي للتابع hash على بيانات الكائن، بينما يُعين عادةً اسم بديل للتابع eql?‎ يشير إلى المعامل == المُستبدَل:

class Book
  attr_reader :author, :title

  def initialize(author, title)
    @author = author
    @title = title
  end

  def ==(other)
    self.class === other and
      other.author == @author and
      other.title == @title
  end

  alias eql? ==

  def hash
    @author.hash ^ @title.hash # XOR
  end
end

book1 = Book.new 'matz', 'Ruby in a Nutshell'
book2 = Book.new 'matz', 'Ruby in a Nutshell'

reviews = {}

reviews[book1] = 'Great reference!'
reviews[book2] = 'Nice and compact!'

reviews.length #=> 1

انظر أيضًا التابع Object.hash والتابع Object.eql?‎.

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

Hash[]‎

ينشئ جدول Hash جديد ويضع فيه الكائنات المعطاة.

new

ينشئ جدول Hash جديد فارغ ثم يعيده.

try_convert

يحاول تحويل الكائن المُمرَّر إليه إلى النوع Hash باستخدام التابعto_hash

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

>

يعيد القيمة true إذا كان الكائن Hash الواقع على يساره مجموعةً فرعيةً من الكائن الواقع على يمينه.

=>

يعيد القيمة true إذا كان الكائن Hash الواقع على يساره مجموعةً فرعيةً من الكائن الواقع على يمينه أو يساويه تمامًا.

==

يتحقق من تساوي كائنين من النوع Hash.

<

يعيد القيمة true إذا كان الكائن الواقع على يمينه مجموعةً فرعيةً من الكائن الواقع على يساره.

=<

يعيد المعامل =< القيمة true إذا كان الكائن الواقع على يمينه مجموعةً فرعيةً من الكائن الواقع على يساره أو يساويه تمامًا.

[]

يجلب القيمة المقابلة لمفتاح معين في الجدول Hash المعطى.

=[]

يربط عند استدعائه بالشكل hsh[key] = value القيمة value المعطاة بالمفتاحkey في الجدول Hash.

any?‎

يمرر كل زوج من مفتاح/قيمة من أزواج الكائن Hash المعطى إلى كتلة معينة ثم يعيد القيمة true إن أعادت الكتلة قيمة غير القيمة false أو nil.

assoc

يبحث ضمن الكائن Hash عن طريق موازنة الكائن المُمرَّر إليه بمفاتيحه باستخدام المعامل == ثم يعيد الزوج قيمة-مفتاح (مصفوفة من عنصرين) أو nil إذا لم يعثر على أي تطابق.

clear

يزيل جميع الأزواج قيمة-مفتاح من الكائن Hash الذي استدعي معه.

compact

يعيد كائن Hash جديد يحوي جميع الأزواج قيم/مفاتيح للكائن الذي استدعي معه باستثناء الأزواج المعدومة (أي ذات القيمة nil).

compact!

يزيل جميع الأزواج قيمة/مفتاح المعدومة (أي ذات القيمة nil) من الكائن الذي استدعي معه.

compare_by_identity

يجعل الكائن Hash يقارن مفاتيحه بواسطة مُعرِّفاتها، أي أنَّها سوف تُعدُّ نفس الكائنات على أنَّها نفس المفاتيح.

compare_by_identity?‎

يتحقق إذا كان الكائن Hash الذي استدعي معه سيقارن مفاتيحه بواسطة مُعرِّفاتهم.

default

يعيد القيمة الافتراضية للمفتاح المُمرَّر إليه؛ أي يعيد القيمة التي سيعيدها الكائنHash إذا كان المفتاح غير موجود فيه.

=default

يضبط عند استدعائه بالشكل default = obj القيمة الافتراضية obj وهي القيمة التي ستُعاد لمفتاح غير موجود في الكائن Hash.

default_proc

يعيد الكتلة التي استُدعي التابع new معها عند إنشاء الكائن Hashالمعطى، وإلا سيُعيد القيمة nil.

=default_proc

يضبط إن استدعي بالشكل default_proc = proc_obj القيمة الافتراضية للكتلة التي ستُنفَّذ عند فشل أية عملية بحث عن مفتاح للكائن Hash المعطى.

delete

يحذف زوجًا ذا مفتاح محدَّد ويعيد قيمته من الكائن Hash الذي استدعي معه.

delete_if

يحذف كل زوج قيمة-مفتاح يحقق شرطًا معيَّنًا من أزواج الكائن Hash المعطى.

dig

يستخرج القيمة المتداخلة المحددة بواسطة تسلسل كائنات تمثِّل المفاتيح عن طريق استدعاء dig في كل خطوة، ويعيد القيمة nil إذا كانت أي خطوة متوسطة هي nil.

each

يستدعي الكتلة المعطاة مرةً واحدةً لكل مفتاح من مفاتيح أزواج الكائن Hash الذي استدعي معه بعد تمرير مفتاح وقيمة الأزواج إليها.

each_key

يستدعي الكتلة المعطاة مرةً واحدةً لكل مفتاح من مفاتيح أزواج الكائن Hash الذي استدعي معه بعد تمرير مفتاح كل زوج إليها.

each_pair

يستدعي الكتلة المعطاة مرةً واحدةً لكل مفتاح من مفاتيح أزواج الكائن Hash الذي استدعي معه بعد تمرير مفتاح وقيمة الأزواج إليها.

each_value

يستدعي الكتلة المعطاة مرةً واحدةً لكل مفتاح من مفاتيح أزواج الكائن Hash الذي استدعي معه بعد تمرير قيمة كل زوج إليها.

empty?‎

يتحقق إذا كان الكائن Hash الذي استدعي معه فارغًا أي لا يحتوي على أية أزواج.

eql?‎

يتحقق إذا كان كائنان من نفس النوع (النوع Hash) ولهما نفس المحتوى. لا يؤخذ ترتيب الأزواج بالحسبان.

fetch

يعيد قيمة من الكائن Hash لمفتاح معين.

fetch_values

يعيد مصفوفة تحتوي على القيم المقترنة بالمفاتيح المعطاة.

flatten

يعيد مصفوفة جديدة والتي تكون تسطيح أحادي الأبعاد للكائن Hash الذي استدعي معه.

has_key?‎

يتحقق إذا كان مفتاحٌ معيَّن موجودًا في الكائن Hash المعطى.

has_value?‎

يعيد إذا كانت قيمةٌ معيَّنةٌ موجودةً في الكائن Hash المعطى ومرتبطة بمفتاح.

hash

يحسب الشيفرة hash للكائن Hash المستدعى معها.

include?‎

يعيد إذا كان مفتاحٌ معيَّن موجودًا في الكائن Hash المعطى.

inspect

يعيد محتوى الكائن Hash الذي استدعي معه في سلسلة نصية.

invert

يعيد كائن جديد من النوع Hash يحوي قيم الكائن Hash الذي استدعي معه كمفاتيح ومفاتيحه كقيم فيه.

keep_if

يبقي كل زوج قيمة-مفتاح يحقق شرطًا معيَّنًا من أزواج الكائن Hash المعطى.

key

يعيد المفتاح المقابل لقيمة معيَّنة في الكائن Hash الذي استدعي معه.

key?‎

يتحقق إذا كان مفتاحٌ محدَّدٌ موجودًا في الكائن Hash المستدعى معه.

keys

يعيد مصفوفة جديدة تحوي مفاتيح الكائن Hash الذي استدعي معه.

length

يعيد عدد الأزواج قيمة-مفتاح الموجودة في الكائن Hash الذي استدعي معه.

member?‎

يتحقق إذا كان مفتاحٌ معيَّن موجودًا في الكائن Hash المعطى.

merge

يدمج كائنين من النوع Hash مع بعضهما بعضًا في كائن جديد من النوع Hash ثم يعيده.

merge!‎

يضيف محتويات الكائن Hash الذي مُمرِّر إليه إلى الكائن الذي استدعي معه.

rassoc

يبحث خلال الكائن Hash الذي استدعي معه عن طريق مقارنة القيمة التي مُمرِّرت إليه مع قيم ذلك الكائن باستخدام المعامل == ثم يعيد أول زوج قيمة-مفتاح متطابق.

rehash

يعيد بناء الكائن Hash استنادًا إلى القيم الحالية لكل مفتاح.

reject

يعيد كائن جديد من النوع Hash يتكون من الأزواج التي ترفضها الكتلة المعطاة.

reject!‎

يحذف الأزواج التي ترفضها الكتلة المعطاة من الكائن Hash الذي استدعي معه. 

replace

يُبدِّل محتويات الكائن المُمرَّر إليه مكان محتويات الكائن Hash الذي استدعي معه.

select

يعيد كائن جديد من النوع Hash يتكون من العناصر التي تعيد الكتلة المعطاة معها القيمة true.

select!‎

يحذف الأزواج التي تقبلها الكتلة المعطاة من الكائن Hash الذي استدعي معه. 

shift

يزيل زوجًا من قيمة-مفتاح من الكائن Hash الذي استدعي معه ويعيده في مصفوفة، أو يعيد القيمة الافتراضية لهذا الكائن إذا كان فارغًا.

size

يعيد عدد الأزواج القيمة-المفتاح الموجودة في الكائن Hash الذي استدعي معه.

slice

يعيد كائنًا من النوع Hash يحتوي فقط على مفاتيح محدَّدة وقيمها.

store

يربط قيمة محددة مع مفتاح محدد في الكائن Hash الذي استدعي معه.

to_a

يحول الكائن Hash الذي استدعي معه إلى مصفوفة متشعبة من المصفوفات [ key, value ].

to_h

يعيد الكائن Hash المعطى نفسه. إذا استُدعي على صنف فرعي من Hash، فستحوِّل المستقبل إلى كائن من النوع Hash.

to_hash

يعيد الكائن Hash المعطى نفسه.

to_proc

to_s

يعيد محتوى الكائن Hash الذي استدعي معه في سلسلة نصية.

transform_keys

يعيد كائن جديد من النوع Hash مع ناتج تنفيذ الكتلة المعطاة مرةً واحدةً لكل مفتاح من مفاتيح الكائن Hash الذي استدعي معه.

transform_keys!‎

يستدعي الكتلة المعطاة مرةً واحدةً لكل مفتاح من مفاتيح الكائن Hash المعطى، ويستبدل به المفتاح الجديد الذي تعيده الكتلة، ثم يعيد هذا الكائن.

transform_values

يعيد كائن جديد من النوع Hash مع ناتج تنفيذ الكتلة المعطاة مرةً واحدةً لكل قيمة من قيم الكائن Hash الذي استدعي معه.

transform_values!‎

يستدعي الكتلة المعطاة مرةً واحدةً لكل قيمة من قيم الكائن Hash المعطى، ويستبدل به القيمة الجديد التي تعيدها الكتلة، ثم يعيد هذا الكائن. لا يُغيّر هذا التابع المفاتيح.

update

يضيف محتويات الكائن المُمرَّر إليه إلى الكائن Hash الذي استدعي معه.

value?‎

يتحقق إذا كانت القيمة المُمرَّرة إليه موجودةً ومرتبطةً بمفتاح ما في الكائن Hash المعطى.

values

يعيد مصفوفة جديدة تحوي قيم الكائن Hash الذي استدعي معه.

values_at

يعيد مصفوفةً تحتوي على القيم المرتبطة بمفاتيح محدَّدة من الكائن Hash الذي استدعي معه.

ملاحظات إضافية

تأتي بعض التوابع التي يستخدمها البعض مع الكائن Hash من الوحدة Enumerable.

إذا لم تعثر على ما تبحث عنه في هذا التوثيق، فاطلع على توثيق Enumerable.

مصادر