الفرق بين المراجعتين لصفحة: «Ruby/Hash»
Khaled-yassin (نقاش | مساهمات) أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE: التجزئة Hash في روبي}}</noinclude> = التجزئة Hash = هي مجموعة تشبه القاموس وتتكون من مفات...' |
Khaled-yassin (نقاش | مساهمات) لا ملخص تعديل |
||
سطر 1: | سطر 1: | ||
هي مجموعة تشبه القاموس وتتكون من مفاتيح فريدة وقيمها. كما تسمى أيضا المصفوفات الترابطية، فهي تشبه المصفوفات Arrays، ولكن بينما تستخدم المصفوفة Array فقط الأعداد الصحيحة كفهرس، تسمح Hash باستخدام أي من أنواع الكائنات. | |||
هي مجموعة تشبه القاموس وتتكون من مفاتيح فريدة وقيمها. كما تسمى أيضا المصفوفات الترابطية، فهي تشبه المصفوفات Arrays، ولكن بينما تستخدم Array الأعداد الصحيحة كفهرس، تسمح Hash باستخدام أي من أنواع الكائنات. | |||
تُرقِّم التجزئات قيمَها بنفس الترتيب الذي أُدرِجت فيه مفاتيحها المقابلة. | تُرقِّم التجزئات قيمَها بنفس الترتيب الذي أُدرِجت فيه مفاتيحها المقابلة. | ||
يمكن أن تُنشأ Hash بسهولة باستخدام شكلها الضمني: | يمكن أن تُنشأ Hash بسهولة باستخدام شكلها الضمني:<syntaxhighlight lang="ruby"> | ||
grades = { "Jane Doe" => 10, "Jim Doe" => 6 } | |||
تسمح التجزئات بصياغة بديلة للمفاتيح التي تكون رموزًا. بدلًا من | </syntaxhighlight>تسمح التجزئات بصياغة بديلة للمفاتيح التي تكون رموزًا. بدلًا من<syntaxhighlight lang="ruby"> | ||
options = { :font_size => 10, :font_family => "Arial" } | |||
و يمكن أن تُكتب: | </syntaxhighlight>و يمكن أن تُكتب:<syntaxhighlight lang="ruby"> | ||
options = { font_size: 10, font_family: "Arial" } | |||
كل مفتاح مُسمَّي هو رمز يمكن الوصول إليه في التجزئة: | </syntaxhighlight>كل مفتاح مُسمَّي هو رمز يمكن الوصول إليه في التجزئة:<syntaxhighlight lang="ruby"> | ||
options[:font_size] # => 10 | |||
ويمكن أيضا أن تنشأ Hash من خلال التابع ::new: | </syntaxhighlight>ويمكن أيضا أن تنشأ Hash من خلال التابع <code>::new</code>:<syntaxhighlight lang="ruby"> | ||
grades = Hash.new | |||
grades["Dorothy Doe"] = 9 | |||
</syntaxhighlight>تتخذ التجزئات قيمة افتراضية تُعاد عند الوصول إلى مفاتيح غير موجودة في التجزئة. إذا لم تتعين قيمة افتراضية تُستخدم nil. ويمكن تعيين القيمة الافتراضية بإرسالها كوسيط إلى <code>::new</code>:<syntaxhighlight lang="ruby"> | |||
grades = Hash.new(0) | |||
</syntaxhighlight>أو باستخدام التابع <code>default=</code>:<syntaxhighlight lang="ruby"> | |||
grades = {"Timmy Doe" => 8} | |||
grades.default = 0 | |||
</syntaxhighlight>يتطلب الوصول إلى قيمة ما في Hash استخدام مفتاحها:<syntaxhighlight lang="ruby"> | |||
puts grades["Jane Doe"] # => 0 | |||
</syntaxhighlight> | |||
===الاستخدامات الشائعة=== | |||
تُعد التجزئات طريقة سهلة لتمثيل هياكل البيانات، مثل<syntaxhighlight lang="ruby"> | |||
books = {} | |||
books[:matz] = "The Ruby Programming Language" | |||
books[:black] = "The Well-Grounded Rubyist" | |||
</syntaxhighlight>كما يشيع استخدام التجزئات كطريقة للحصول على معاملات مسماة في الدوال. لاحظ أنه لا توجد أقواس مستخدمة أدناه. إذا كانت التجزئة هي الوسيط الأخير في استدعاء التابع، لا يلزم استخدام أقواس، وبالتالي إنشاء واجهة مُرتَّبة جدًا:<syntaxhighlight lang="ruby"> | |||
Person.create(name: "John Doe", age: 27) | |||
=== | def self.create(params) | ||
@name = params[:name] | |||
@age = params[:age] | |||
end | |||
</syntaxhighlight> | |||
===مفاتيح التجزئة=== | |||
يُشير كائنان إلى نفس مفتاح التجزئة عندما تكون قيمتا <code>hash</code> الخاصة بهما متطابقة ويكون الكائنان <code>eql?</code> لبعضهم البعض. | |||
قد يستخدم صنف معرف من قِبَل المستخدم كمفتاح تجزئة إذا أُبطِل التابعَيْن <code>hash</code> و <code>eql?</code> لتوفير سلوك ذو معنى. بشكل افتراضي، تشير المثيلات المنفصلة إلى مفاتيح تجزئة منفصلة. | |||
=== | ويستند التطبيق النموذجي للتجزئة hash على بيانات الكائن، بينما يُعين عادةً اسم مستعار للتابع <code>eql?</code> يشير إلى التابع المُبطِل <code>==</code>:<syntaxhighlight lang="ruby"> | ||
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 | |||
</syntaxhighlight>انظر أيضا <code>Object#hash</code> و <code>Object#eql?</code>. | |||
===توابع الصنف العام=== | |||
==== <code>Hash[ key, value, ... ] → new_hash</code> ==== | |||
==== <code>Hash[ [ [key, value], ... ] ] → new_hash</code> ==== | |||
==== <code>Hash[ object ] → new_hash</code> ==== | |||
إنشاء تجزئة جديدة ممتلئة بالكائنات المعطاة. | |||
= | |||
على غرار القيمة الحرفية { key => value, ... }. في الشكل الأول، تأتي المفاتيح والقيم في أزواج، لذلك يجب أن يكون هناك عدد زوجي من الوسائط. | |||
يُمرر في الشكلين الثاني والثالث وسيطٌا واحدٌا ويكون إما مصفوفة من أزواج القيمة-المفتاح أو كائن قابل للتحويل إلى تجزئة.<syntaxhighlight lang="ruby"> | |||
Hash["a", 100, "b", 200] #=> {"a"=>100, "b"=>200} | |||
Hash[ [ ["a", 100], ["b", 200] ] ] #=> {"a"=>100, "b"=>200} | |||
Hash["a" => 100, "b" => 200] #=> {"a"=>100, "b"=>200} | |||
</syntaxhighlight> | |||
==== <code>new → new_hash</code> ==== | |||
==== <code>new(obj) → new_hash</code> ==== | |||
لا | ==== <code>new {|hash, key| block } → new_hash</code> ==== | ||
إعادة تجزئة جديدة فارغة. إذا وصل بعد ذلك مفتاحٌ لا يتوافق مع إدخال تجزئة إلى هذه التجزئة، تعتمد القيمة المُعادة على نمط <code>new</code> يستخدم لإنشاء التجزئة. في الشكل الأول، يُعيد الوصول <code>nil</code>. إذا حُدِد <code>obj</code> ، سيُستخدم هذا الكائن وحده لكافة القيم الافتراضية. إذا حُدِدت كتلة، ستُستدعى مع كائن التجزئة والمفتاح، ويجب إعادة القيمة الافتراضية. ومن مسؤولية الكتلة تخزين القيمة في التجزئة إذا لزم الأمر.<syntaxhighlight lang="ruby"> | |||
h = Hash.new("Go Fish") | |||
h["a"] = 100 | |||
h["b"] = 200 | |||
h["a"] #=> 100 | |||
h["c"] #=> "Go Fish" | |||
# The following alters the single default object | |||
h["c"].upcase! #=> "GO FISH" | |||
h["d"] #=> "GO FISH" | |||
h.keys #=> ["a", "b"] | |||
hash > | # While this creates a new default object each time | ||
h = Hash.new { |hash, key| hash[key] = "Go Fish: #{key}" } | |||
h["c"] #=> "Go Fish: c" | |||
h["c"].upcase! #=> "GO FISH: C" | |||
h["d"] #=> "Go Fish: d" | |||
h.keys #=> ["c", "d"] | |||
</syntaxhighlight> | |||
==== <code>try_convert(obj) → hash or nil</code> ==== | |||
محاولة تحويل <code>obj</code> إلى تجزئة باستخدام التابع <code>#to_hash</code>. وإعادة التجزئة المُحوَّلة أو <code>nil</code> إذا تعذر تحويل <code>obj</code> لأي سبب.<syntaxhighlight lang="ruby"> | |||
ash.try_convert({1=>2}) # => {1=>2} | |||
Hash.try_convert("1=>2") # => nil | |||
</syntaxhighlight> | |||
===توابع المثيل العام=== | |||
hash >= other | ==== <code>hash < other → true or false</code> ==== | ||
يُعيد <code>true</code> إذا كانت <code>hash</code> مجموعة فرعية من <code>other</code>.<syntaxhighlight lang="ruby"> | |||
h1 = {a:1, b:2} | |||
h2 = {a:1, b:2, c:3} | |||
h1 < h2 #=> true | |||
h2 < h1 #=> false | |||
h1 < h1 #=> false | |||
</syntaxhighlight> | |||
إعادة true إذا | ==== <code>hash <= other → true or false</code> ==== | ||
إعادة <code>true</code> إذا كانت <code>hash</code> مجموعة فرعية من <code>other</code> أو تساوي <code>other</code>.<syntaxhighlight lang="ruby"> | |||
h1 = {a:1, b:2} | |||
h2 = {a:1, b:2, c:3} | |||
h1 <= h2 #=> true | |||
h2 <= h1 #=> false | |||
h1 <= h1 #=> true | |||
</syntaxhighlight> | |||
hsh | ==== <code>hsh == other_hash → true or false</code> ==== | ||
المساواة — تتساوى تجزئتان إذا كان كل منهما يحتوي على نفس العدد من المفاتيح وإذا كان كل زوج القيمة-المفتاح يساوي العناصر المناظرة في التجزئة الأخرى وفقًا <code>Object#==</code>.<syntaxhighlight lang="ruby"> | |||
h1 = { "a" => 1, "c" => 2 } | |||
h2 = { 7 => 35, "c" => 2, "a" => 1 } | |||
h3 = { "a" => 1, "c" => 2, 7 => 35 } | |||
h4 = { "a" => 1, "d" => 2, "f" => 35 } | |||
h1 == h2 #=> false | |||
h2 == h3 #=> true | |||
h3 == h4 #=> false | |||
</syntaxhighlight>لا يقارن ترتيب كل التجزئات.<syntaxhighlight lang="ruby"> | |||
h1 = { "a" => 1, "c" => 2 } | |||
h2 = { "c" => 2, "a" => 1 } | |||
h1 == h2 #=> true | |||
</syntaxhighlight> | |||
==== <code>hash > other → true or false</code> ==== | |||
إعادة <code>true</code> إذا كان <code>other</code> مجموعة فرعية من <code>hash</code>.<syntaxhighlight lang="ruby"> | |||
h1 = {a:1, b:2} | |||
h2 = {a:1, b:2, c:3} | |||
h1 > h2 #=> false | |||
h2 > h1 #=> true | |||
h1 > h1 #=> false | |||
</syntaxhighlight> | |||
==== <code>hash >= other → true or false</code> ==== | |||
إعادة <code>true</code> إذا كان <code>other</code> مجموعة فرعية من <code>hash</code> أو يساوي <code>hash</code>.<syntaxhighlight lang="ruby"> | |||
h1 = {a:1, b:2} | |||
h2 = {a:1, b:2, c:3} | |||
h1 >= h2 #=> false | |||
h2 >= h1 #=> true | |||
h1 >= h1 #=> true | |||
</syntaxhighlight> | |||
== | ==== <code>hsh[key] → value</code> ==== | ||
مرجع العنصر — استرداد الكائن <code>value</code> المقابل لكائن <code>key</code>. وإذا لم يُعثر عليه، تُعاد القيمة الافتراضية (راجع <code>Hash::new</code> لمزيد من التفاصيل).<syntaxhighlight lang="ruby"> | |||
h = { "a" => 100, "b" => 200 } | |||
h["a"] #=> 100 | |||
h["c"] #=> nil | |||
</syntaxhighlight> | |||
==== <code>hsh[key] = value → value</code> ==== | |||
==تعيين عنصر== | |||
ربط القيمة <code>value</code> المُعطاة مع المفتاح <code>key</code> المُعطي.<syntaxhighlight lang="ruby"> | |||
h = { "a" => 100, "b" => 200 } | |||
h["a"] = 9 | |||
h["c"] = 4 | |||
h #=> {"a"=>9, "b"=>200, "c"=>4} | |||
h.store("d", 42) #=> 42 | |||
h #=> {"a"=>9, "b"=>200, "c"=>4, "d"=>42} | |||
</syntaxhighlight>لا يجب تغيير قيمة <code>key</code> أثناء استخدامه كمفتاح (ستكرر السلاسل غير المجمدة <code>unfrozen</code> المُمررة كمفتاح وتُجمَّد).<syntaxhighlight lang="ruby"> | |||
a = "a" | |||
b = "b".freeze | |||
h = { a => 100, b => 200 } | |||
h.key(100).equal? a #=> false | |||
h.key(200).equal? b #=> true | |||
</syntaxhighlight> | |||
راجع أيضًا Enumerable#any? | ==== <code>any? [{ |(key, value)| block }] → true or false</code> ==== | ||
راجع أيضًا <code>Enumerable#any?</code> | |||
==== <code>assoc(obj) → an_array or nil</code> ==== | |||
البحث خلال التجزئة عن طريق مقارنة obj بالمفتاح باستخدام ==. يعيد زوج القيمة-االمفتاح (مصفوفة من عنصرين) أو nil إذا لم يعثر على أي تطابق. راجع Array#assoc. | البحث خلال التجزئة عن طريق مقارنة obj بالمفتاح باستخدام ==. يعيد زوج القيمة-االمفتاح (مصفوفة من عنصرين) أو nil إذا لم يعثر على أي تطابق. راجع Array#assoc. | ||
clear → hsh | ==== <code>clear → hsh</code> ==== | ||
يزيل جميع أزواج القيمة-المفتاح من hsh. | يزيل جميع أزواج القيمة-المفتاح من hsh. | ||
compact → new_hash | ==== <code>compact → new_hash</code> ==== | ||
يُعيد تجزئة جديدة مع إزالة أزواج القيم/المفاتيح الصفرية | يُعيد تجزئة جديدة مع إزالة أزواج القيم/المفاتيح الصفرية | ||
compact! → hsh or nil | ==== <code>compact! → hsh or nil</code> ==== | ||
يزيل جميع قيم hsh من التجزئة. إعادة صفر إذا لم يُجرى أية تغييرات، وإلا يُعيد التجزئة. | يزيل جميع قيم hsh من التجزئة. إعادة صفر إذا لم يُجرى أية تغييرات، وإلا يُعيد التجزئة. | ||
compare_by_identity → hsh | ==== <code>compare_by_identity → hsh</code> ==== | ||
يجعل hsh يقارن مفاتيحه بواسطة مُعرِّفه، أي إنها سوف تعتبر نفس الكائنات على أنها نفس المفاتيح. | يجعل hsh يقارن مفاتيحه بواسطة مُعرِّفه، أي إنها سوف تعتبر نفس الكائنات على أنها نفس المفاتيح. | ||
compare_by_identity? → true or false | ==== <code>compare_by_identity? → true or false</code> ==== | ||
إعادة true إذا كانت hsh ستقارن مفاتيحها بواسطة مُعرِّفهم. راجع أيضا Hash#compare_by_identity. | إعادة true إذا كانت hsh ستقارن مفاتيحها بواسطة مُعرِّفهم. راجع أيضا Hash#compare_by_identity. | ||
default(key=nil) → obj | ==== <code>default(key=nil) → obj</code> ==== | ||
إعادة القيمة الافتراضية، القيمة مُعادة بواسطة hsh إذا كان key غير موجود في hsh. راجع أيضًا Hash::new and Hash#default=. | إعادة القيمة الافتراضية، القيمة مُعادة بواسطة hsh إذا كان key غير موجود في hsh. راجع أيضًا Hash::new and Hash#default=. | ||
default = obj → obj | ==== <code>default = obj → obj</code> ==== | ||
تعيين القيمة الافتراضية، القيمة المُعادة لمفتاح غير موجود في التجزئة. ليس من الممكن ضب القيمة الافتراضية على Proc التي ستنفذ على كل بحث عن مفتاح. | تعيين القيمة الافتراضية، القيمة المُعادة لمفتاح غير موجود في التجزئة. ليس من الممكن ضب القيمة الافتراضية على Proc التي ستنفذ على كل بحث عن مفتاح. | ||
default_proc → anObject | ==== <code>default_proc → anObject</code> ==== | ||
إذا استُدعي Hash::new مع كتلة، سيُعيد هذه الكتلة، وإلا سيُعيد nil. | إذا استُدعي Hash::new مع كتلة، سيُعيد هذه الكتلة، وإلا سيُعيد nil. | ||
سطر 139: | سطر 237: | ||
تعيين proc الافتراضية التي ستُنفَّذ عند فشل أي بحث عن مفتاح. | تعيين proc الافتراضية التي ستُنفَّذ عند فشل أي بحث عن مفتاح. | ||
delete(key) → value | ==== <code>delete(key) → value</code> ==== | ||
==== <code>delete(key) {| key | block } → value</code> ==== | |||
حذف زوج القيمة-المفتاح وإعادة القيمة من hsh والذي يكون مفتاحها key. ويُعيد nil إذا كان المفتاح غير موجود. إذا توفرت كتلة الشيفرة البرمجية الاختيارية وكان المفتاح غير موجود، يُمرر المفتاح وتُعاد نتيجة block. | حذف زوج القيمة-المفتاح وإعادة القيمة من hsh والذي يكون مفتاحها key. ويُعيد nil إذا كان المفتاح غير موجود. إذا توفرت كتلة الشيفرة البرمجية الاختيارية وكان المفتاح غير موجود، يُمرر المفتاح وتُعاد نتيجة block. | ||
delete_if {| key, value | block } → hsh | ==== <code>delete_if {| key, value | block } → hsh</code> ==== | ||
==== <code>delete_if → an_enumerator</code> ==== | |||
حذف كل أزواج القيمة-المفتاح من hsh التي تُقيَّم لها block بالقيمة true. | حذف كل أزواج القيمة-المفتاح من hsh التي تُقيَّم لها block بالقيمة true. | ||
إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك. | إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك. | ||
dig(key, ...) → object | ==== <code>dig(key, ...) → object</code> ==== | ||
استخراج القيمة المتداخلة المحددة بواسطة تسلسل كائنات key عن طريق استدعاء dig في كل خطوة، وإعادة nil إذا كانت أي خطوة متوسطة nil. | استخراج القيمة المتداخلة المحددة بواسطة تسلسل كائنات key عن طريق استدعاء dig في كل خطوة، وإعادة nil إذا كانت أي خطوة متوسطة nil. | ||
each {| key, value | block } → hsh | ==== <code>each {| key, value | block } → hsh</code> ==== | ||
each_pair {| key, value | block } → hsh | ==== <code>each_pair {| key, value | block } → hsh</code> ==== | ||
each → an_enumerator | ==== <code>each → an_enumerator</code> ==== | ||
==== <code>each_pair → an_enumerator</code> ==== | |||
استدعاء block مرة واحدة لكل مفتاح في hsh، وتمرير زوج القيمة-المفتاح كمعاملات. | استدعاء block مرة واحدة لكل مفتاح في hsh، وتمرير زوج القيمة-المفتاح كمعاملات. | ||
سطر 171: | سطر 265: | ||
يُنتِج: | يُنتِج: | ||
each_key {| key | block } → hsh | ==== <code>each_key {| key | block } → hsh</code> ==== | ||
==== <code>each_key → an_enumerator</code> ==== | |||
استدعاء block مرة واحدة لكل مفتاح في hsh، وتمرير المفتاح كمعامل. | استدعاء block مرة واحدة لكل مفتاح في hsh، وتمرير المفتاح كمعامل. | ||
سطر 181: | سطر 274: | ||
يُنتِج: | يُنتِج: | ||
each_pair {| key, value | block } → hsh | ==== <code>each_pair {| key, value | block } → hsh</code> ==== | ||
==== <code>each_pair → an_enumerator</code> ==== | |||
استدعاء block مرة واحدة لكل مفتاح في hsh، وتمرير زوج القيمة-المفتاح كمعاملات. | استدعاء block مرة واحدة لكل مفتاح في hsh، وتمرير زوج القيمة-المفتاح كمعاملات. | ||
سطر 191: | سطر 283: | ||
يُنتِج: | يُنتِج: | ||
each_value {| value | block } → hsh | ==== <code>each_value {| value | block } → hsh</code> ==== | ||
==== <code>each_value → an_enumerator</code> ==== | |||
استدعاء block مرة واحدة لكل مفتاح في hsh، وتمرير المفتاح كمعامل. | استدعاء block مرة واحدة لكل مفتاح في hsh، وتمرير المفتاح كمعامل. | ||
سطر 201: | سطر 292: | ||
يُنتِج: | يُنتِج: | ||
empty? → true or false | ==== <code>empty? → true or false</code> ==== | ||
إعادة true إذا كانت hsh لا تحتوي على أزواج القيمة-المفتاح. | إعادة true إذا كانت hsh لا تحتوي على أزواج القيمة-المفتاح. | ||
eql?(other) → true or false | ==== <code>eql?(other) → true or false</code> ==== | ||
إعادة true إذا كان كلٌ من hash و other تجزئتين بنفس المحتوى. لا يقارن ترتيب كل التجزئات. | إعادة true إذا كان كلٌ من hash و other تجزئتين بنفس المحتوى. لا يقارن ترتيب كل التجزئات. | ||
fetch(key [, default] ) → obj | ==== <code>fetch(key [, default] ) → obj</code> ==== | ||
==== <code>fetch(key) {| key | block } → obj</code> ==== | |||
إعادة قيمة من التجزئة لمفتاح معين. إذا كان المفتاح غير موجود، هناك عدة خيارات: مع عدم وجود وسائط أخرى، سيُجرى استثناء KeyError، إذا أُعطيَ default، ستُعاد هذه إذا حُدِدت كتلة الشيفرة البرمجية الاختيارية، ثم ستُنفَّذ وتُعاد نتيجتها. | إعادة قيمة من التجزئة لمفتاح معين. إذا كان المفتاح غير موجود، هناك عدة خيارات: مع عدم وجود وسائط أخرى، سيُجرى استثناء KeyError، إذا أُعطيَ default، ستُعاد هذه إذا حُدِدت كتلة الشيفرة البرمجية الاختيارية، ثم ستُنفَّذ وتُعاد نتيجتها. | ||
سطر 219: | سطر 307: | ||
يُنتِج: | يُنتِج: | ||
fetch_values(key, ...) → array | ==== <code>fetch_values(key, ...) → array</code> ==== | ||
==== <code>fetch_values(key, ...) { |key| block } → array</code> ==== | |||
إعادة مصفوفة تحتوي على القيم المقترنة بالمفاتيح المعطاة ولكن تُجرى أيضًا KeyError عند تعذر العثور على أحد المفاتيح. راجع أيضًا Hash#values_at و Hash#fetch. | إعادة مصفوفة تحتوي على القيم المقترنة بالمفاتيح المعطاة ولكن تُجرى أيضًا KeyError عند تعذر العثور على أحد المفاتيح. راجع أيضًا Hash#values_at و Hash#fetch. | ||
flatten → an_array | ==== <code>flatten → an_array</code> ==== | ||
==== <code>flatten(level) → an_array</code> ==== | |||
إعادة مصفوفة جديدة والتي تكون تسطيح أحادي الأبعاد لهذا التجزئة. أي أن لكل مفتاح أو قيمة تكون مصفوفة، تستخرج عناصرها إلى مصفوفة جديدة. على عكس Array#flatten، لا يُسطِّح هذا التابع بشكل عَودي افتراضيًا. يُحدد الوسيط الاختياري level مستوى عودية التسطح. | إعادة مصفوفة جديدة والتي تكون تسطيح أحادي الأبعاد لهذا التجزئة. أي أن لكل مفتاح أو قيمة تكون مصفوفة، تستخرج عناصرها إلى مصفوفة جديدة. على عكس Array#flatten، لا يُسطِّح هذا التابع بشكل عَودي افتراضيًا. يُحدد الوسيط الاختياري level مستوى عودية التسطح. | ||
has_key?(key) → true or false | ==== <code>has_key?(key) → true or false</code> ==== | ||
إعادة true إذا كان مفتاح معين موجود في hsh. | إعادة true إذا كان مفتاح معين موجود في hsh. | ||
علمًا بأن include? و member? لا يختبرا تساوي الأعضاء باستخدام == كما تفعل غيرها من العدَّادات. | علمًا بأن include? و member? لا يختبرا تساوي الأعضاء باستخدام == كما تفعل غيرها من العدَّادات. | ||
راجع أيضًا Enumerable#include? | راجع أيضًا <code>Enumerable#include?</code> | ||
==== <code>has_value?(value) → true or false</code> ==== | |||
إعادة true إذا كانت القيمة المُعطاة موجودة لمفتاح ما في hsh. | إعادة true إذا كانت القيمة المُعطاة موجودة لمفتاح ما في hsh. | ||
hash → integer | ==== <code>hash → integer</code> ==== | ||
حساب رمز التجزئة لهذه التجزئة. سيكون لتجزئتين لهما نفس المحتوى نفس رمز التجزئة (وستقارن باستخدام eql?). | حساب رمز التجزئة لهذه التجزئة. سيكون لتجزئتين لهما نفس المحتوى نفس رمز التجزئة (وستقارن باستخدام eql?). | ||
راجع أيضًا Object#hash. | راجع أيضًا Object#hash. | ||
include?(key) → true or false | ==== <code>include?(key) → true or false</code> ==== | ||
إعادة true إذا كان مفتاح معين موجود في hsh. | إعادة true إذا كان مفتاح معين موجود في hsh. | ||
علمًا بأن include? و member? لا يختبرا تساوي الأعضاء باستخدام == كما تفعل غيرها من العدَّادات. | علمًا بأن include? و member? لا يختبرا تساوي الأعضاء باستخدام == كما تفعل غيرها من العدَّادات. | ||
راجع أيضًا Enumerable#include? | راجع أيضًا <code>Enumerable#include?</code> | ||
to_s → string | ==== <code>to_s → string</code> ==== | ||
==== <code>inspect → string</code> ==== | |||
إعادة محتويات هذا التجزئة كسلسلة نصية. | إعادة محتويات هذا التجزئة كسلسلة نصية. | ||
ويُعيَّن له أيضًا الاسم المستعار: to_s. | ويُعيَّن له أيضًا الاسم المستعار: to_s. | ||
invert → new_hash | ==== <code>invert → new_hash</code> ==== | ||
إعادة تجزئة جديدة مُنشأة باستخدام قيم hsh كمفاتيح والمفاتيح كقيم. إذا وُجِد بالفعل مفتاح بنفس القيمة في hsh، سيستخدم آخر واحد مُعرَّف، وستُتجاهل القيم السابقة. | إعادة تجزئة جديدة مُنشأة باستخدام قيم hsh كمفاتيح والمفاتيح كقيم. إذا وُجِد بالفعل مفتاح بنفس القيمة في hsh، سيستخدم آخر واحد مُعرَّف، وستُتجاهل القيم السابقة. | ||
سطر 273: | سطر 353: | ||
الشرط، ألا يوجد مفتاح بنفس القيمة، ويمكن اختباره بمقارنة حجم التجزئة المقلوبة. | الشرط، ألا يوجد مفتاح بنفس القيمة، ويمكن اختباره بمقارنة حجم التجزئة المقلوبة. | ||
keep_if {| key, value | block } → hsh | ==== <code>keep_if {| key, value | block } → hsh</code> ==== | ||
==== <code>keep_if → an_enumerator</code> ==== | |||
حذف كل أزواج القيمة-المفتاح من hsh والتي تقيَّم لها block بالقيمة false. | حذف كل أزواج القيمة-المفتاح من hsh والتي تقيَّم لها block بالقيمة false. | ||
إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك. | إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك. | ||
key(value) → key | ==== <code>key(value) → key</code> ==== | ||
إعادة مفتاح تواجد قيمة معينة. ويُعيد nil إذا كانت القيمة غير موجود. | إعادة مفتاح تواجد قيمة معينة. ويُعيد nil إذا كانت القيمة غير موجود. | ||
key?(key) → true or false | ==== <code>key?(key) → true or false</code> ==== | ||
إعادة true إذا كان مفتاح معين موجود في hsh. | إعادة true إذا كان مفتاح معين موجود في hsh. | ||
سطر 293: | سطر 370: | ||
راجع أيضًا Enumerable#include? | راجع أيضًا Enumerable#include? | ||
keys → array | ==== <code>keys → array</code> ==== | ||
إعادة مصفوفة جديدة ممتلئة بالمفاتيح من هذه التجزئة. راجع أيضًا Hash#values. | إعادة مصفوفة جديدة ممتلئة بالمفاتيح من هذه التجزئة. راجع أيضًا Hash#values. | ||
length → integer | ==== <code>length → integer</code> ==== | ||
إعادة عدد أزواج القيمة-المفتاح في التجزئة. | إعادة عدد أزواج القيمة-المفتاح في التجزئة. | ||
member?(key) → true or false | ==== <code>member?(key) → true or false</code> ==== | ||
إعادة true إذا كان مفتاح معين موجود في hsh. | إعادة true إذا كان مفتاح معين موجود في hsh. | ||
سطر 309: | سطر 383: | ||
راجع أيضًا Enumerable#include? | راجع أيضًا Enumerable#include? | ||
merge(other_hash) → new_hash | ==== <code>merge(other_hash) → new_hash</code> ==== | ||
merge(other_hash){|key, oldval, newval| block} → new_hash | merge(other_hash){|key, oldval, newval| block} → new_hash | ||
إعادة تجزئة جديدة تحتوي على محتويات other_hash ومحتويات hsh. إذا لم تُحدد أي كتلة، ستكون قيمة العناصر ذات المفاتيح المُكررة هي نفسها من other_hash. وإلا تُحدَد قيمة كل مفتاح مكرر عن طريق استدعاء الكتلة مع المفتاح، وتكون قيمته في hsh وقيمته في other_hash. | إعادة تجزئة جديدة تحتوي على محتويات other_hash ومحتويات hsh. إذا لم تُحدد أي كتلة، ستكون قيمة العناصر ذات المفاتيح المُكررة هي نفسها من other_hash. وإلا تُحدَد قيمة كل مفتاح مكرر عن طريق استدعاء الكتلة مع المفتاح، وتكون قيمته في hsh وقيمته في other_hash. | ||
merge!(other_hash) → hsh | ==== <code>merge!(other_hash) → hsh</code> ==== | ||
==== <code>merge!(other_hash){|key, oldval, newval| block} → hsh</code> ==== | |||
إضافة محتويات other_hash إلى hsh. إذا لم تُحدَد أي كتلة، يُكتب فوق الإدخالات ذات المفاتيح المكررة مع القيم من other_hash، وإلا تُحدَّد قيمة كل مفتاح مكرر عن طريق استدعاء الكتلة مع المفتاح وقيمته في hsh وقيمته في other_hash. | إضافة محتويات other_hash إلى hsh. إذا لم تُحدَد أي كتلة، يُكتب فوق الإدخالات ذات المفاتيح المكررة مع القيم من other_hash، وإلا تُحدَّد قيمة كل مفتاح مكرر عن طريق استدعاء الكتلة مع المفتاح وقيمته في hsh وقيمته في other_hash. | ||
rassoc(obj) → an_array or nil | ==== <code>rassoc(obj) → an_array or nil</code> ==== | ||
البحث خلال التجزئة عن طريق مقارنة obj بالقيمة باستخدام ==. إعادة أول زوج القيمة-المفتاح (مصفوفة من عنصرين) يتطابق. راجع أيضًا Array#rassoc. | البحث خلال التجزئة عن طريق مقارنة obj بالقيمة باستخدام ==. إعادة أول زوج القيمة-المفتاح (مصفوفة من عنصرين) يتطابق. راجع أيضًا Array#rassoc. | ||
rehash → hsh | ==== <code>rehash → hsh</code> ==== | ||
إعادة بناء التجزئة استنادًا إلى قيم التجزئة الحالية لكل مفتاح. إذا تغيرت قيم كائنات المفاتيح منذ إدراجها، سيعيد هذا التابع فهرسة hsh. إذا اُستدعيَ Hash#rehash بينما يجتاز مُكرِّر التجزئة، سينطلق RuntimeError في المُكرِّر. | إعادة بناء التجزئة استنادًا إلى قيم التجزئة الحالية لكل مفتاح. إذا تغيرت قيم كائنات المفاتيح منذ إدراجها، سيعيد هذا التابع فهرسة hsh. إذا اُستدعيَ Hash#rehash بينما يجتاز مُكرِّر التجزئة، سينطلق RuntimeError في المُكرِّر. | ||
reject {|key, value| block} → a_hash | ==== <code>reject {|key, value| block} → a_hash</code> ==== | ||
==== <code>reject → an_enumerator</code> ==== | |||
إعادة تجزئة جديدة تتكون من العناصر التي تعيد الكتلة لها false. | إعادة تجزئة جديدة تتكون من العناصر التي تعيد الكتلة لها false. | ||
إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك. | إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك. | ||
reject! {| key, value | block } → hsh or nil | ==== <code>reject! {| key, value | block } → hsh or nil</code> ==== | ||
==== <code>reject! → an_enumerator</code> ==== | |||
يعادل Hash#delete_if، ولكن يُعيد nil إذا لم تُجرى أية تغييرات. | يعادل Hash#delete_if، ولكن يُعيد nil إذا لم تُجرى أية تغييرات. | ||
replace(other_hash) → hsh | ==== <code>replace(other_hash) → hsh</code> ==== | ||
استبدال محتويات hsh بمحتويات other_hash. | استبدال محتويات hsh بمحتويات other_hash. | ||
select {|key, value| block} → a_hash | ==== <code>select {|key, value| block} → a_hash</code> ==== | ||
==== <code>select → an_enumerator</code> ==== | |||
إعادة تجزئة جديدة تتكون من العناصر التي تعيد الكتلة لها true. | إعادة تجزئة جديدة تتكون من العناصر التي تعيد الكتلة لها true. | ||
إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك. | إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك. | ||
select! {| key, value | block } → hsh or nil | ==== <code>select! {| key, value | block } → hsh or nil</code> ==== | ||
==== <code>select! → an_enumerator</code> ==== | |||
يعادل Hash#keep_if، ولكن يُعيد nil إذا لم تُجرى أية تغييرات. | يعادل Hash#keep_if، ولكن يُعيد nil إذا لم تُجرى أية تغييرات. | ||
shift → anArray or obj | ==== <code>shift → anArray or obj</code> ==== | ||
يزيل زوج القيمة-المفتاح من hsh ويقوم بإعادتها كمصفوفة من العنصرين [ key, value ]، أو القيمة الافتراضية للتجزئة إذا كانت التجزئة فارغة. | يزيل زوج القيمة-المفتاح من hsh ويقوم بإعادتها كمصفوفة من العنصرين [ key, value ]، أو القيمة الافتراضية للتجزئة إذا كانت التجزئة فارغة. | ||
size → integer | ==== <code>size → integer</code> ==== | ||
إعادة عدد أزواج القيمة-المفتاح في التجزئة. | إعادة عدد أزواج القيمة-المفتاح في التجزئة. | ||
slice(*keys) → a_hash | ==== <code>slice(*keys) → a_hash</code> ==== | ||
إعادة تجزئة تحتوي فقط على المفاتيح المُعطاة وقيمها. | إعادة تجزئة تحتوي فقط على المفاتيح المُعطاة وقيمها. | ||
store(key, value) → value | ==== <code>store(key, value) → value</code> ==== | ||
== تعيين عنصر == | ==تعيين عنصر== | ||
يربط القيمة value المُعطاة مع المفتاح key المُعطي. | يربط القيمة value المُعطاة مع المفتاح key المُعطي. | ||
لا يجب تغيير قيمة key أثناء استخدامه كمفتاح (ستكرر السلاسل غير المجمدة unfrozen المُمررة كمفتاح وتُجمَّد). | لا يجب تغيير قيمة key أثناء استخدامه كمفتاح (ستكرر السلاسل غير المجمدة unfrozen المُمررة كمفتاح وتُجمَّد). | ||
to_a → array | ==== <code>to_a → array</code> ==== | ||
تحويل hsh إلى مصفوفة متداخلة من المصفوفات [ key, value ]. | تحويل hsh إلى مصفوفة متداخلة من المصفوفات [ key, value ]. | ||
to_h → hsh or new_hash | ==== <code>to_h → hsh or new_hash</code> ==== | ||
إعادة self. إذا استُدعي علي صنف فرعي من Hash، تحوِّل المُتلقي إلى كائن Hash. | إعادة self. إذا استُدعي علي صنف فرعي من Hash، تحوِّل المُتلقي إلى كائن Hash. | ||
to_hash => hsh | ==== <code>to_hash => hsh</code> ==== | ||
إعادة self. | إعادة self. | ||
to_proc() | <code>to_proc()</code> | ||
==== <code>to_s()</code> ==== | |||
اسم المستعار لـ inspect | اسم المستعار لـ inspect | ||
transform_keys {|key| block } → new_hash | ==== <code>transform_keys {|key| block } → new_hash</code> ==== | ||
==== <code>transform_keys → an_enumerator</code> ==== | |||
إعادة تجزئة جديدة مع نتائج تشغيل الكتلة مرة واحدة لكل مفتاح. لا يُغيّر هذا التابع القيم. | إعادة تجزئة جديدة مع نتائج تشغيل الكتلة مرة واحدة لكل مفتاح. لا يُغيّر هذا التابع القيم. | ||
إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك. | إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك. | ||
transform_keys! {|key| block } → hsh | ==== <code>transform_keys! {|key| block } → hsh</code> ==== | ||
==== <code>transform_keys! → an_enumerator</code> ==== | |||
استدعاء الكتلة المعطاة مرة واحدة لكل مفتاح في hsh، واستبداله بالمفتاح الجديد الذي تعيده الكتلة، ثم تُعيد hsh. لا يُغيّر هذا التابع القيم. | استدعاء الكتلة المعطاة مرة واحدة لكل مفتاح في hsh، واستبداله بالمفتاح الجديد الذي تعيده الكتلة، ثم تُعيد hsh. لا يُغيّر هذا التابع القيم. | ||
إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك. | إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك. | ||
transform_values {|value| block } → new_hash | ==== <code>transform_values {|value| block } → new_hash</code> ==== | ||
==== <code>transform_values → an_enumerator</code> ==== | |||
إعادة تجزئة جديدة مع نتائج تشغيل الكتلة مرة واحدة لكل قيمة. لا يُغيّر هذا التابع المفاتيح. | إعادة تجزئة جديدة مع نتائج تشغيل الكتلة مرة واحدة لكل قيمة. لا يُغيّر هذا التابع المفاتيح. | ||
إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك. | إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك. | ||
transform_values! {|value| block } → hsh | ==== <code>transform_values! {|value| block } → hsh</code> ==== | ||
==== <code>transform_values! → an_enumerator</code> ==== | |||
استدعاء الكتلة المعطاة مرة واحدة لكل قيمة في hsh، واستبداله بالقيمة الجديدة التي تعيدها الكتلة، ثم تُعيد hsh. لا يُغيّر هذا التابع المفاتيح. | استدعاء الكتلة المعطاة مرة واحدة لكل قيمة في hsh، واستبداله بالقيمة الجديدة التي تعيدها الكتلة، ثم تُعيد hsh. لا يُغيّر هذا التابع المفاتيح. | ||
إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك. | إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك. | ||
update(other_hash) → hsh | ==== <code>update(other_hash) → hsh</code> ==== | ||
==== <code>update(other_hash){|key, oldval, newval| block} → hsh</code> ==== | |||
إضافة محتويات other_hash إلى hsh. إذا لم تُحدَد أي كتلة، يُكتب فوق الإدخالات ذات المفاتيح المكررة مع القيم من other_hash، وإلا تُحدَّد قيمة كل مفتاح مكرر عن طريق استدعاء الكتلة مع المفتاح وقيمته في hsh وقيمته في other_hash. | إضافة محتويات other_hash إلى hsh. إذا لم تُحدَد أي كتلة، يُكتب فوق الإدخالات ذات المفاتيح المكررة مع القيم من other_hash، وإلا تُحدَّد قيمة كل مفتاح مكرر عن طريق استدعاء الكتلة مع المفتاح وقيمته في hsh وقيمته في other_hash. | ||
value?(value) → true or false | ==== <code>value?(value) → true or false</code> ==== | ||
إعادة true إذا كانت القيمة المُعطاة موجودة لمفتاح ما في hsh. | إعادة true إذا كانت القيمة المُعطاة موجودة لمفتاح ما في hsh. | ||
values → array | ==== <code>values → array</code> ==== | ||
إعادة مصفوفة جديدة ممتلئة بالقيم من hsh. راجع أيضًا Hash#keys. | إعادة مصفوفة جديدة ممتلئة بالقيم من hsh. راجع أيضًا Hash#keys. | ||
values_at(key, ...) → arrayclick to toggle source | ==== <code>values_at(key, ...) → arrayclick to toggle source</code> ==== | ||
إعادة مصفوفة تحتوي على القيم المرتبطة بالمفاتيح المُعطاة. راجع أيضًا Hash.select. | إعادة مصفوفة تحتوي على القيم المرتبطة بالمفاتيح المُعطاة. راجع أيضًا Hash.select. | ||
=مصادر= | |||
= مصادر = | <span> </span>[http://ruby-doc.org/core-2.5.1/Hash.html صفحة Hash في توثيق روبي الرسمي.] | ||
[[تصنيف:Ruby]] | [[تصنيف:Ruby]] |
مراجعة 00:05، 17 أكتوبر 2018
هي مجموعة تشبه القاموس وتتكون من مفاتيح فريدة وقيمها. كما تسمى أيضا المصفوفات الترابطية، فهي تشبه المصفوفات Arrays، ولكن بينما تستخدم المصفوفة Array فقط الأعداد الصحيحة كفهرس، تسمح Hash باستخدام أي من أنواع الكائنات.
تُرقِّم التجزئات قيمَها بنفس الترتيب الذي أُدرِجت فيه مفاتيحها المقابلة.
يمكن أن تُنشأ Hash بسهولة باستخدام شكلها الضمني:
grades = { "Jane Doe" => 10, "Jim Doe" => 6 }
تسمح التجزئات بصياغة بديلة للمفاتيح التي تكون رموزًا. بدلًا من
options = { :font_size => 10, :font_family => "Arial" }
و يمكن أن تُكتب:
options = { font_size: 10, font_family: "Arial" }
كل مفتاح مُسمَّي هو رمز يمكن الوصول إليه في التجزئة:
options[:font_size] # => 10
ويمكن أيضا أن تنشأ Hash من خلال التابع ::new
:
grades = Hash.new
grades["Dorothy Doe"] = 9
تتخذ التجزئات قيمة افتراضية تُعاد عند الوصول إلى مفاتيح غير موجودة في التجزئة. إذا لم تتعين قيمة افتراضية تُستخدم nil. ويمكن تعيين القيمة الافتراضية بإرسالها كوسيط إلى ::new
:
grades = Hash.new(0)
أو باستخدام التابع default=
:
grades = {"Timmy Doe" => 8}
grades.default = 0
يتطلب الوصول إلى قيمة ما في Hash استخدام مفتاحها:
puts grades["Jane Doe"] # => 0
الاستخدامات الشائعة
تُعد التجزئات طريقة سهلة لتمثيل هياكل البيانات، مثل
books = {}
books[:matz] = "The Ruby Programming Language"
books[:black] = "The Well-Grounded Rubyist"
كما يشيع استخدام التجزئات كطريقة للحصول على معاملات مسماة في الدوال. لاحظ أنه لا توجد أقواس مستخدمة أدناه. إذا كانت التجزئة هي الوسيط الأخير في استدعاء التابع، لا يلزم استخدام أقواس، وبالتالي إنشاء واجهة مُرتَّبة جدًا:
Person.create(name: "John Doe", age: 27)
def self.create(params)
@name = params[:name]
@age = params[:age]
end
مفاتيح التجزئة
يُشير كائنان إلى نفس مفتاح التجزئة عندما تكون قيمتا hash
الخاصة بهما متطابقة ويكون الكائنان eql?
لبعضهم البعض.
قد يستخدم صنف معرف من قِبَل المستخدم كمفتاح تجزئة إذا أُبطِل التابعَيْن 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[ key, value, ... ] → new_hash
Hash[ [ [key, value], ... ] ] → new_hash
Hash[ object ] → new_hash
إنشاء تجزئة جديدة ممتلئة بالكائنات المعطاة.
على غرار القيمة الحرفية { key => value, ... }. في الشكل الأول، تأتي المفاتيح والقيم في أزواج، لذلك يجب أن يكون هناك عدد زوجي من الوسائط.
يُمرر في الشكلين الثاني والثالث وسيطٌا واحدٌا ويكون إما مصفوفة من أزواج القيمة-المفتاح أو كائن قابل للتحويل إلى تجزئة.
Hash["a", 100, "b", 200] #=> {"a"=>100, "b"=>200}
Hash[ [ ["a", 100], ["b", 200] ] ] #=> {"a"=>100, "b"=>200}
Hash["a" => 100, "b" => 200] #=> {"a"=>100, "b"=>200}
new → new_hash
new(obj) → new_hash
new {|hash, key| block } → new_hash
إعادة تجزئة جديدة فارغة. إذا وصل بعد ذلك مفتاحٌ لا يتوافق مع إدخال تجزئة إلى هذه التجزئة، تعتمد القيمة المُعادة على نمط new
يستخدم لإنشاء التجزئة. في الشكل الأول، يُعيد الوصول nil
. إذا حُدِد obj
، سيُستخدم هذا الكائن وحده لكافة القيم الافتراضية. إذا حُدِدت كتلة، ستُستدعى مع كائن التجزئة والمفتاح، ويجب إعادة القيمة الافتراضية. ومن مسؤولية الكتلة تخزين القيمة في التجزئة إذا لزم الأمر.
h = Hash.new("Go Fish")
h["a"] = 100
h["b"] = 200
h["a"] #=> 100
h["c"] #=> "Go Fish"
# The following alters the single default object
h["c"].upcase! #=> "GO FISH"
h["d"] #=> "GO FISH"
h.keys #=> ["a", "b"]
# While this creates a new default object each time
h = Hash.new { |hash, key| hash[key] = "Go Fish: #{key}" }
h["c"] #=> "Go Fish: c"
h["c"].upcase! #=> "GO FISH: C"
h["d"] #=> "Go Fish: d"
h.keys #=> ["c", "d"]
try_convert(obj) → hash or nil
محاولة تحويل obj
إلى تجزئة باستخدام التابع #to_hash
. وإعادة التجزئة المُحوَّلة أو nil
إذا تعذر تحويل obj
لأي سبب.
ash.try_convert({1=>2}) # => {1=>2}
Hash.try_convert("1=>2") # => nil
توابع المثيل العام
hash < other → true or false
يُعيد true
إذا كانت hash
مجموعة فرعية من other
.
h1 = {a:1, b:2}
h2 = {a:1, b:2, c:3}
h1 < h2 #=> true
h2 < h1 #=> false
h1 < h1 #=> false
hash <= other → true or false
إعادة true
إذا كانت hash
مجموعة فرعية من other
أو تساوي other
.
h1 = {a:1, b:2}
h2 = {a:1, b:2, c:3}
h1 <= h2 #=> true
h2 <= h1 #=> false
h1 <= h1 #=> true
hsh == other_hash → true or false
المساواة — تتساوى تجزئتان إذا كان كل منهما يحتوي على نفس العدد من المفاتيح وإذا كان كل زوج القيمة-المفتاح يساوي العناصر المناظرة في التجزئة الأخرى وفقًا Object#==
.
h1 = { "a" => 1, "c" => 2 }
h2 = { 7 => 35, "c" => 2, "a" => 1 }
h3 = { "a" => 1, "c" => 2, 7 => 35 }
h4 = { "a" => 1, "d" => 2, "f" => 35 }
h1 == h2 #=> false
h2 == h3 #=> true
h3 == h4 #=> false
لا يقارن ترتيب كل التجزئات.
h1 = { "a" => 1, "c" => 2 }
h2 = { "c" => 2, "a" => 1 }
h1 == h2 #=> true
hash > other → true or false
إعادة true
إذا كان other
مجموعة فرعية من hash
.
h1 = {a:1, b:2}
h2 = {a:1, b:2, c:3}
h1 > h2 #=> false
h2 > h1 #=> true
h1 > h1 #=> false
hash >= other → true or false
إعادة true
إذا كان other
مجموعة فرعية من hash
أو يساوي hash
.
h1 = {a:1, b:2}
h2 = {a:1, b:2, c:3}
h1 >= h2 #=> false
h2 >= h1 #=> true
h1 >= h1 #=> true
hsh[key] → value
مرجع العنصر — استرداد الكائن value
المقابل لكائن key
. وإذا لم يُعثر عليه، تُعاد القيمة الافتراضية (راجع Hash::new
لمزيد من التفاصيل).
h = { "a" => 100, "b" => 200 }
h["a"] #=> 100
h["c"] #=> nil
hsh[key] = value → value
تعيين عنصر
ربط القيمة value
المُعطاة مع المفتاح key
المُعطي.
h = { "a" => 100, "b" => 200 }
h["a"] = 9
h["c"] = 4
h #=> {"a"=>9, "b"=>200, "c"=>4}
h.store("d", 42) #=> 42
h #=> {"a"=>9, "b"=>200, "c"=>4, "d"=>42}
لا يجب تغيير قيمة key
أثناء استخدامه كمفتاح (ستكرر السلاسل غير المجمدة unfrozen
المُمررة كمفتاح وتُجمَّد).
a = "a"
b = "b".freeze
h = { a => 100, b => 200 }
h.key(100).equal? a #=> false
h.key(200).equal? b #=> true
any? [{ |(key, value)| block }] → true or false
راجع أيضًا Enumerable#any?
assoc(obj) → an_array or nil
البحث خلال التجزئة عن طريق مقارنة obj بالمفتاح باستخدام ==. يعيد زوج القيمة-االمفتاح (مصفوفة من عنصرين) أو nil إذا لم يعثر على أي تطابق. راجع Array#assoc.
clear → hsh
يزيل جميع أزواج القيمة-المفتاح من hsh.
compact → new_hash
يُعيد تجزئة جديدة مع إزالة أزواج القيم/المفاتيح الصفرية
compact! → hsh or nil
يزيل جميع قيم hsh من التجزئة. إعادة صفر إذا لم يُجرى أية تغييرات، وإلا يُعيد التجزئة.
compare_by_identity → hsh
يجعل hsh يقارن مفاتيحه بواسطة مُعرِّفه، أي إنها سوف تعتبر نفس الكائنات على أنها نفس المفاتيح.
compare_by_identity? → true or false
إعادة true إذا كانت hsh ستقارن مفاتيحها بواسطة مُعرِّفهم. راجع أيضا Hash#compare_by_identity.
default(key=nil) → obj
إعادة القيمة الافتراضية، القيمة مُعادة بواسطة hsh إذا كان key غير موجود في hsh. راجع أيضًا Hash::new and Hash#default=.
default = obj → obj
تعيين القيمة الافتراضية، القيمة المُعادة لمفتاح غير موجود في التجزئة. ليس من الممكن ضب القيمة الافتراضية على Proc التي ستنفذ على كل بحث عن مفتاح.
default_proc → anObject
إذا استُدعي Hash::new مع كتلة، سيُعيد هذه الكتلة، وإلا سيُعيد nil.
default_proc = proc_obj أو صفر
تعيين proc الافتراضية التي ستُنفَّذ عند فشل أي بحث عن مفتاح.
delete(key) → value
delete(key) {| key | block } → value
حذف زوج القيمة-المفتاح وإعادة القيمة من hsh والذي يكون مفتاحها key. ويُعيد nil إذا كان المفتاح غير موجود. إذا توفرت كتلة الشيفرة البرمجية الاختيارية وكان المفتاح غير موجود، يُمرر المفتاح وتُعاد نتيجة block.
delete_if {| key, value | block } → hsh
delete_if → an_enumerator
حذف كل أزواج القيمة-المفتاح من hsh التي تُقيَّم لها block بالقيمة true.
إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك.
dig(key, ...) → object
استخراج القيمة المتداخلة المحددة بواسطة تسلسل كائنات key عن طريق استدعاء dig في كل خطوة، وإعادة nil إذا كانت أي خطوة متوسطة nil.
each {| key, value | block } → hsh
each_pair {| key, value | block } → hsh
each → an_enumerator
each_pair → an_enumerator
استدعاء block مرة واحدة لكل مفتاح في hsh، وتمرير زوج القيمة-المفتاح كمعاملات.
إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك.
يُنتِج:
each_key {| key | block } → hsh
each_key → an_enumerator
استدعاء block مرة واحدة لكل مفتاح في hsh، وتمرير المفتاح كمعامل.
إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك.
يُنتِج:
each_pair {| key, value | block } → hsh
each_pair → an_enumerator
استدعاء block مرة واحدة لكل مفتاح في hsh، وتمرير زوج القيمة-المفتاح كمعاملات.
إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك.
يُنتِج:
each_value {| value | block } → hsh
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.