|
|
(1 مراجعات متوسطة بواسطة نفس المستخدم غير معروضة) |
سطر 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> باستخدام أيٍّ من أنواع الكائنات لاستعمالها كفهرس وربطها بقيمٍ. |
|
| |
|
| هي مجموعة تشبه القاموس وتتكون من مفاتيح فريدة وقيمها. كما تسمى أيضا المصفوفات الترابطية، فهي تشبه المصفوفات Arrays، ولكن بينما تستخدم المصفوفة Array فقط الأعداد الصحيحة كفهرس، تسمح Hash باستخدام أي من أنواع الكائنات.
| | ترتَّب وتحصى القيم في النوع <code>Hash</code> بنفس الترتيب الذي أُدرِجت فيه مفاتيحها المقابلة. |
|
| |
|
| تُرقِّم التجزئات قيمَها بنفس الترتيب الذي أُدرِجت فيه مفاتيحها المقابلة.
| | يمكن إنشاء جدول <code>Hash</code> بسهولة باستخدام شكله الصريح:<syntaxhighlight lang="ruby"> |
| | |
| يمكن أن تُنشأ Hash بسهولة باستخدام شكلها الضمني:<syntaxhighlight lang="ruby"> | |
| grades = { "Jane Doe" => 10, "Jim Doe" => 6 } | | grades = { "Jane Doe" => 10, "Jim Doe" => 6 } |
|
| |
|
| </syntaxhighlight>تسمح التجزئات بصياغة بديلة للمفاتيح التي تكون رموزًا. بدلًا من<syntaxhighlight lang="ruby"> | | </syntaxhighlight>يسمح الجدول <code>Hash</code> باستعمال [[Ruby/Symbol|الرموز]] كصيغة بديلة للمفاتيح. انظر مثلًا إلى المثال التالي:<syntaxhighlight lang="ruby"> |
| options = { :font_size => 10, :font_family => "Arial" } | | options = { :font_size => 10, :font_family => "Arial" } |
|
| |
|
| </syntaxhighlight>و يمكن أن تُكتب:<syntaxhighlight lang="ruby"> | | </syntaxhighlight>و يمكن أن تُكتب أيضًا بالشكل التالي:<syntaxhighlight lang="ruby"> |
| options = { font_size: 10, font_family: "Arial" } | | options = { font_size: 10, font_family: "Arial" } |
|
| |
|
| </syntaxhighlight>كل مفتاح مُسمَّي هو رمز يمكن الوصول إليه في التجزئة:<syntaxhighlight lang="ruby"> | | </syntaxhighlight>كل مفتاح مُسمَّى هو [[Ruby/Symbol|رمز]] يمكن الوصول إليه في الجدول <code>Hash</code>:<syntaxhighlight lang="ruby"> |
| options[:font_size] # => 10 | | options[:font_size] # => 10 |
|
| |
|
| </syntaxhighlight>ويمكن أيضا أن تنشأ Hash من خلال التابع <code>::new</code>:<syntaxhighlight lang="ruby"> | | </syntaxhighlight>ويمكن أيضا أن إنشاء جدول <code>Hash</code> من خلال التابع <code>[[Ruby/Hash/new|new]]</code>:<syntaxhighlight lang="ruby"> |
| grades = Hash.new | | grades = Hash.new |
| grades["Dorothy Doe"] = 9 | | grades["Dorothy Doe"] = 9 |
| </syntaxhighlight>تتخذ التجزئات قيمة افتراضية تُعاد عند الوصول إلى مفاتيح غير موجودة في التجزئة. إذا لم تتعين قيمة افتراضية تُستخدم nil. ويمكن تعيين القيمة الافتراضية بإرسالها كوسيط إلى <code>::new</code>:<syntaxhighlight lang="ruby"> | | </syntaxhighlight>تملك الجداول <code>Hash</code> قيمةً افتراضيةً تُعاد عند الوصول إلى مفاتيح غير موجودة. إذا لم تُعيَّن قيمة افتراضية، فستُستخدم القيمة <code>nil</code>. ويمكن تعيين القيمة الافتراضية بتمريرها إلى [[Ruby/Hash/new|<code>new</code>]]:<syntaxhighlight lang="ruby"> |
| grades = Hash.new(0) | | grades = Hash.new(0) |
|
| |
|
| </syntaxhighlight>أو باستخدام التابع <code>default=</code>:<syntaxhighlight lang="ruby"> | | </syntaxhighlight>أو باستخدام التابع [[Ruby/Hash/default-3D|<code>default</code>]]:<syntaxhighlight lang="ruby"> |
| grades = {"Timmy Doe" => 8} | | grades = {"Timmy Doe" => 8} |
| grades.default = 0 | | grades.default = 0 |
| </syntaxhighlight>يتطلب الوصول إلى قيمة ما في Hash استخدام مفتاحها:<syntaxhighlight lang="ruby"> | | </syntaxhighlight>يتطلب الوصول إلى قيمة ما في الجدول <code>Hash</code> استخدام مفتاحها:<syntaxhighlight lang="ruby"> |
| puts grades["Jane Doe"] # => 0 | | puts grades["Jane Doe"] # => 0 |
|
| |
|
| </syntaxhighlight> | | </syntaxhighlight> |
| ===الاستخدامات الشائعة=== | | ==استخدامات شائعة== |
| تُعد التجزئات طريقة سهلة لتمثيل هياكل البيانات، مثل<syntaxhighlight lang="ruby">
| | يعد النوع <code>Hash</code> طريقةً سهلةً لتمثيل هياكل البيانات مثل:<syntaxhighlight lang="ruby"> |
| books = {} | | books = {} |
| books[:matz] = "The Ruby Programming Language" | | books[:matz] = "The Ruby Programming Language" |
| books[:black] = "The Well-Grounded Rubyist" | | books[:black] = "The Well-Grounded Rubyist" |
|
| |
|
| </syntaxhighlight>كما يشيع استخدام التجزئات كطريقة للحصول على معاملات مسماة في الدوال. لاحظ أنه لا توجد أقواس مستخدمة أدناه. إذا كانت التجزئة هي الوسيط الأخير في استدعاء التابع، لا يلزم استخدام أقواس، وبالتالي إنشاء واجهة مُرتَّبة جدًا:<syntaxhighlight lang="ruby"> | | </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) | | Person.create(name: "John Doe", age: 27) |
|
| |
|
سطر 44: |
سطر 43: |
| end | | end |
| </syntaxhighlight> | | </syntaxhighlight> |
| ===مفاتيح التجزئة=== | | ==المفاتيح في النوع <code>Hash</code>== |
| يُشير كائنان إلى نفس مفتاح التجزئة عندما تكون قيمتا <code>hash</code> الخاصة بهما متطابقة ويكون الكائنان <code>eql?</code> لبعضهم البعض. | | يُشير كائنان إلى نفس المفتاح في الجدول <code>Hash</code> عندما تكون القيمة المرتبطة بأحدهما مماثلة ومساوية للقيمة المرتبطة بالمفتاح الآخر. |
|
| |
|
| قد يستخدم صنف معرف من قِبَل المستخدم كمفتاح تجزئة إذا أُبطِل التابعَيْن <code>hash</code> و <code>eql?</code> لتوفير سلوك ذو معنى. بشكل افتراضي، تشير المثيلات المنفصلة إلى مفاتيح تجزئة منفصلة. | | قد يُستخدَم صنف معرف من قِبَل المستخدم كمفتاح إذا استُبدِل التابعَيْن <code>[[Ruby/Hash/hash|hash]]</code> و <code>[[Ruby/Hash/eql-3F|eql?]]</code> لتوفير سلوك ذو معنى. بشكل افتراضي، تشير النُسَخ المنفصلة إلى مفاتيح منفصلة. |
|
| |
|
| ويستند التطبيق النموذجي للتجزئة hash على بيانات الكائن، بينما يُعين عادةً اسم مستعار للتابع <code>eql?</code> يشير إلى التابع المُبطِل <code>==</code>:<syntaxhighlight lang="ruby"> | | ويستند التنفيذ النموذجي للتابع [[Ruby/Hash/hash|<code>hash</code>]] على بيانات الكائن، بينما يُعين عادةً اسم بديل للتابع <code>[[Ruby/Hash/eql-3F|eql?]]</code> يشير إلى المعامل <code>[[Ruby/Hash/equal|==]]</code> المُستبدَل:<syntaxhighlight lang="ruby"> |
| class Book | | class Book |
| attr_reader :author, :title | | attr_reader :author, :title |
سطر 80: |
سطر 79: |
|
| |
|
| reviews.length #=> 1 | | reviews.length #=> 1 |
| </syntaxhighlight>انظر أيضا <code>Object#hash</code> و <code>Object#eql?</code>. | | </syntaxhighlight>انظر أيضًا التابع <code>[[Ruby/Object/hash|Object.hash]]</code> والتابع <code>[[Ruby/Object/eql-3F|Object.eql?]]</code>. |
| ===توابع الصنف العام===
| | ==توابع الصنف العام== |
| ====<code>Hash[ key, value, ... ] → new_hash</code>====
| | ===<code>[[Ruby/Hash/index|Hash[]]]</code>=== |
| ====<code>Hash[ [ [key, value], ... ] ] → new_hash</code>====
| | ينشئ جدول <code>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"]
| |
| | |
| # 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>
| |
| ===توابع المثيل العام===
| |
| ====<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>
| |
| ====<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>
| |
| ====<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><syntaxhighlight lang="ruby">
| |
| | |
| VALUE
| |
| rb_hash_aset(VALUE hash, VALUE key, VALUE val)
| |
| {
| |
| int iter_lev = RHASH_ITER_LEV(hash);
| |
| st_table *tbl = RHASH(hash)->ntbl;
| |
| | |
| rb_hash_modify(hash);
| |
| if (!tbl) {
| |
| if (iter_lev > 0) no_new_key();
| |
| tbl = hash_tbl(hash);
| |
| }
| |
| if (tbl->type == &identhash || rb_obj_class(key) != rb_cString) {
| |
| RHASH_UPDATE_ITER(hash, iter_lev, key, hash_aset, val);
| |
| }
| |
| else {
| |
| RHASH_UPDATE_ITER(hash, iter_lev, key, hash_aset_str, val);
| |
| }
| |
| return val;
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
| ====<code>any? [{ |(key, value)| block }] → true or false</code>====
| |
| راجع أيضًا <code>Enumerable#any?</code><syntaxhighlight lang="ruby">
| |
|
| |
| static VALUE
| |
| rb_hash_any_p(int argc, VALUE *argv, VALUE hash)
| |
| {
| |
| VALUE args[2];
| |
| args[0] = Qfalse;
| |
| | |
| rb_check_arity(argc, 0, 1);
| |
| if (RHASH_EMPTY_P(hash)) return Qfalse;
| |
| if (argc) {
| |
| args[1] = argv[0];
| |
| | |
| rb_hash_foreach(hash, any_p_i_pattern, (VALUE)args);
| |
| }
| |
| else {
| |
| if (!rb_block_given_p()) {
| |
| /* yields pairs, never false */
| |
| return Qtrue;
| |
| }
| |
| if (rb_block_arity() > 1)
| |
| rb_hash_foreach(hash, any_p_i_fast, (VALUE)args);
| |
| else
| |
| rb_hash_foreach(hash, any_p_i, (VALUE)args);
| |
| }
| |
| return args[0];
| |
| }
| |
| </syntaxhighlight>
| |
| ====<code>assoc(obj) → an_array or nil</code>====
| |
| البحث خلال التجزئة عن طريق مقارنة <code>obj</code> بالمفتاح باستخدام التابع <code>==</code>. وإعادة زوج القيمة-االمفتاح (مصفوفة من عنصرين) أو <code>nil</code> إذا لم يعثر على أي تطابق. راجع <code>Array#assoc</code>.<syntaxhighlight lang="ruby">
| |
| h = {"colors" => ["red", "blue", "green"],
| |
| "letters" => ["a", "b", "c" ]}
| |
| h.assoc("letters") #=> ["letters", ["a", "b", "c"]]
| |
| h.assoc("foo") #=> nil
| |
| </syntaxhighlight>
| |
| ====<code>clear → hsh</code>====
| |
| يزيل جميع أزواج القيمة-المفتاح من <code>hsh</code>.<syntaxhighlight lang="ruby">
| |
| h = { "a" => 100, "b" => 200 } #=> {"a"=>100, "b"=>200}
| |
| h.clear #=> {}
| |
| </syntaxhighlight>
| |
| ====<code>compact → new_hash</code>====
| |
| إعادة تجزئة جديدة مع إزالة أزواج القيم/المفاتيح الصفرية.<syntaxhighlight lang="ruby">
| |
| h = { "a" => 100, "b" => 200 } #=> {"a"=>100, "b"=>200}
| |
| h.clear #=> {}
| |
| </syntaxhighlight>
| |
| ====<code>compact! → hsh or nil</code>====
| |
| إزالة جميع قيم <code>hsh</code> من التجزئة. إعادة صفر إذا لم يُجرى أية تغييرات، وإلا يُعيد التجزئة.<syntaxhighlight lang="ruby">
| |
| h = { a: 1, b: false, c: nil }
| |
| h.compact! #=> { a: 1, b: false }
| |
| </syntaxhighlight>
| |
| ====<code>compare_by_identity → hsh</code>====
| |
| جعل <code>hsh</code> يقارن مفاتيحه بواسطة مُعرِّفه، أي إنها سوف تعتبر نفس الكائنات على أنها نفس المفاتيح.<syntaxhighlight lang="ruby">
| |
| h1 = { "a" => 100, "b" => 200, :c => "c" }
| |
| h1["a"] #=> 100
| |
| h1.compare_by_identity
| |
| h1.compare_by_identity? #=> true
| |
| h1["a".dup] #=> nil # different objects.
| |
| h1[:c] #=> "c" # same symbols are all same.
| |
| </syntaxhighlight>
| |
| ====<code>compare_by_identity? → true or false</code>====
| |
| إعادة <code>true</code> إذا كانت <code>hsh</code> ستقارن مفاتيحها بواسطة مُعرِّفهم. راجع أيضا <code>Hash#compare_by_identity</code>.<syntaxhighlight lang="ruby">
| |
|
| |
| VALUE
| |
| rb_hash_compare_by_id_p(VALUE hash)
| |
| {
| |
| if (!RHASH(hash)->ntbl)
| |
| return Qfalse;
| |
| if (RHASH(hash)->ntbl->type == &identhash) {
| |
| return Qtrue;
| |
| }
| |
| return Qfalse;
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
| ====<code>default(key=nil) → obj</code>====
| |
| إعادة القيمة الافتراضية، القيمة مُعادة بواسطة <code>hsh</code> إذا كان <code>key</code> غير موجود في <code>hsh</code>. راجع أيضًا <code>Hash::new</code> و <code>Hash#default=</code>.<syntaxhighlight lang="ruby">
| |
| h = Hash.new #=> {}
| |
| h.default #=> nil
| |
| h.default(2) #=> nil
| |
| | |
| h = Hash.new("cat") #=> {}
| |
| h.default #=> "cat"
| |
| h.default(2) #=> "cat"
| |
| | |
| h = Hash.new {|h,k| h[k] = k.to_i*10} #=> {}
| |
| h.default #=> nil
| |
| h.default(2) #=> 20
| |
| </syntaxhighlight>
| |
| ====<code>default = obj → obj</code>====
| |
| تعيين القيمة الافتراضية، القيمة المُعادة لمفتاح غير موجود في التجزئة. ليس من الممكن ضب القيمة الافتراضية على <code>Proc</code> التي ستنفذ على كل بحث عن مفتاح.<syntaxhighlight lang="ruby">
| |
| h = { "a" => 100, "b" => 200 }
| |
| h.default = "Go fish"
| |
| h["a"] #=> 100
| |
| h["z"] #=> "Go fish"
| |
| # This doesn't do what you might hope...
| |
| h.default = proc do |hash, key|
| |
| hash[key] = key + key
| |
| end
| |
| h[2] #=> #<Proc:0x401b3948@-:6>
| |
| h["cat"] #=> #<Proc:0x401b3948@-:6>
| |
| </syntaxhighlight>
| |
| ====<code>default_proc → anObject</code>====
| |
| إذا استُدعي <code>Hash::new</code> مع كتلة، سيُعيد هذه الكتلة، وإلا سيُعيد <code>nil</code>.<syntaxhighlight lang="ruby">
| |
| h = Hash.new {|h,k| h[k] = k*k } #=> {}
| |
| p = h.default_proc #=> #<Proc:0x401b3d08@-:1>
| |
| a = [] #=> []
| |
| p.call(a, 2)
| |
| a #=> [nil, nil, 4]
| |
| </syntaxhighlight>
| |
| ====<code>default_proc = proc_obj or nil</code>====
| |
| تعيين <code>proc</code> الافتراضية التي ستُنفَّذ عند فشل أي بحث عن مفتاح.<syntaxhighlight lang="ruby">
| |
| h.default_proc = proc do |hash, key|
| |
| hash[key] = key + key
| |
| end
| |
| h[2] #=> 4
| |
| h["cat"] #=> "catcat"
| |
| </syntaxhighlight><syntaxhighlight lang="ruby">
| |
|
| |
| VALUE
| |
| rb_hash_set_default_proc(VALUE hash, VALUE proc)
| |
| {
| |
| VALUE b;
| |
| | |
| rb_hash_modify_check(hash);
| |
| if (NIL_P(proc)) {
| |
| SET_DEFAULT(hash, proc);
| |
| return proc;
| |
| }
| |
| b = rb_check_convert_type_with_id(proc, T_DATA, "Proc", idTo_proc);
| |
| if (NIL_P(b) || !rb_obj_is_proc(b)) {
| |
| rb_raise(rb_eTypeError,
| |
| "wrong default_proc type %s (expected Proc)",
| |
| rb_obj_classname(proc));
| |
| }
| |
| proc = b;
| |
| SET_PROC_DEFAULT(hash, proc);
| |
| return proc;
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
| ====<code>delete(key) → value</code>====
| |
| ====<code>delete(key) {| key | block } → value</code>====
| |
| حذف زوج القيمة-المفتاح وإعادة القيمة من <code>hsh</code> والذي يكون مفتاحها <code>key</code>. ويُعيد <code>nil</code> إذا كان المفتاح غير موجود. إذا توفرت كتلة الشيفرة البرمجية الاختيارية وكان المفتاح غير موجود، يُمرر المفتاح وتُعاد نتيجة <code>block</code>.<syntaxhighlight lang="ruby">
| |
| h = { "a" => 100, "b" => 200 }
| |
| h.delete("a") #=> 100
| |
| h.delete("z") #=> nil
| |
| h.delete("z") { |el| "#{el} not found" } #=> "z not found"
| |
| </syntaxhighlight><syntaxhighlight lang="ruby">
| |
|
| |
| static VALUE
| |
| rb_hash_delete_m(VALUE hash, VALUE key)
| |
| {
| |
| VALUE val;
| |
| | |
| rb_hash_modify_check(hash);
| |
| val = rb_hash_delete_entry(hash, key);
| |
| | |
| if (val != Qundef) {
| |
| return val;
| |
| }
| |
| else {
| |
| if (rb_block_given_p()) {
| |
| return rb_yield(key);
| |
| }
| |
| else {
| |
| return Qnil;
| |
| }
| |
| }
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
| ====<code>delete_if {| key, value | block } → hsh</code>====
| |
| ====<code>delete_if → an_enumerator</code>====
| |
| حذف كل أزواج القيمة-المفتاح من <code>hsh</code> التي تُقيَّم لها <code>block</code> بالقيمة <code>true</code>.
| |
| | |
| إذا لم تُعطَى <code>block</code>، يُعاد عدَّاد بدلًا من ذلك.<syntaxhighlight lang="ruby">
| |
| h = { "a" => 100, "b" => 200, "c" => 300 }
| |
| h.delete_if {|key, value| key >= "b" } #=> {"a"=>100}
| |
| | |
| </syntaxhighlight>أمثلة<syntaxhighlight lang="ruby">
| |
|
| |
| VALUE
| |
| rb_hash_delete_if(VALUE hash)
| |
| {
| |
| RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
| |
| rb_hash_modify_check(hash);
| |
| if (RHASH(hash)->ntbl)
| |
| rb_hash_foreach(hash, delete_if_i, hash);
| |
| return hash;
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
| ====<code>dig(key, ...) → object</code>====
| |
| استخراج القيمة المتداخلة المحددة بواسطة تسلسل كائنات <code>key</code> عن طريق استدعاء <code>dig</code> في كل خطوة، وإعادة <code>nil</code> إذا كانت أي خطوة متوسطة <code>nil</code>.<syntaxhighlight lang="ruby">
| |
| h = { foo: {bar: {baz: 1}}}
| |
| | |
| h.dig(:foo, :bar, :baz) #=> 1
| |
| h.dig(:foo, :zot, :xyz) #=> nil
| |
| | |
| g = { foo: [10, 11, 12] }
| |
| g.dig(:foo, 1) #=> 11
| |
| g.dig(:foo, 1, 0) #=> TypeError: Integer does not have #dig method
| |
| g.dig(:foo, :bar) #=> TypeError: no implicit conversion of Symbol into Integer
| |
| </syntaxhighlight>أمثلة<syntaxhighlight lang="ruby">
| |
|
| |
| VALUE
| |
| rb_hash_dig(int argc, VALUE *argv, VALUE self)
| |
| {
| |
| rb_check_arity(argc, 1, UNLIMITED_ARGUMENTS);
| |
| self = rb_hash_aref(self, *argv);
| |
| if (!--argc) return self;
| |
| ++argv;
| |
| return rb_obj_dig(argc, argv, self, Qnil);
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
| ====<code>each {| key, value | block } → hsh</code>====
| |
| ====<code>each_pair {| key, value | block } → hsh</code>====
| |
| ====<code>each → an_enumerator</code>====
| |
| ====<code>each_pair → an_enumerator</code>====
| |
| استدعاء <code>block</code> مرة واحدة لكل مفتاح في <code>hsh</code>، وتمرير زوج القيمة-المفتاح كمعاملات.
| |
| | |
| إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك.<syntaxhighlight lang="ruby">
| |
| h = { "a" => 100, "b" => 200 }
| |
| h.each {|key, value| puts "#{key} is #{value}" }
| |
| </syntaxhighlight>يُنتِج:<syntaxhighlight lang="ruby">
| |
| a is 100
| |
| b is 200
| |
| </syntaxhighlight>أمثلة<syntaxhighlight lang="ruby">
| |
|
| |
| static VALUE
| |
| rb_hash_each_pair(VALUE hash)
| |
| {
| |
| RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
| |
| if (rb_block_arity() > 1)
| |
| rb_hash_foreach(hash, each_pair_i_fast, 0);
| |
| else
| |
| rb_hash_foreach(hash, each_pair_i, 0);
| |
| return hash;
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
| ====<code>each_key {| key | block } → hsh</code>====
| |
| ====<code>each_key → an_enumerator</code>====
| |
| استدعاء <code>block</code> مرة واحدة لكل مفتاح في <code>hsh</code>، وتمرير المفتاح كمعامل.
| |
| | |
| إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك.<syntaxhighlight lang="ruby">
| |
| h = { "a" => 100, "b" => 200 }
| |
| h.each_key {|key| puts key }
| |
| </syntaxhighlight>يُنتِج:<syntaxhighlight lang="ruby">
| |
| a
| |
| b
| |
| </syntaxhighlight>أمثلة<syntaxhighlight lang="ruby">
| |
|
| |
| static VALUE
| |
| rb_hash_each_key(VALUE hash)
| |
| {
| |
| RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
| |
| rb_hash_foreach(hash, each_key_i, 0);
| |
| return hash;
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
| ====<code>each_pair {| key, value | block } → hsh</code>====
| |
| ====<code>each_pair → an_enumerator</code>====
| |
| استدعاء <code>block</code> مرة واحدة لكل مفتاح في <code>hsh</code>، وتمرير زوج القيمة-المفتاح كمعاملات.
| |
| | |
| إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك.<syntaxhighlight lang="ruby">
| |
| h = { "a" => 100, "b" => 200 }
| |
| h.each {|key, value| puts "#{key} is #{value}" }
| |
| </syntaxhighlight>يُنتِج:<syntaxhighlight lang="ruby">
| |
| a is 100
| |
| b is 200
| |
| </syntaxhighlight>أمثلة<syntaxhighlight lang="ruby">
| |
|
| |
| static VALUE
| |
| rb_hash_each_pair(VALUE hash)
| |
| {
| |
| RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
| |
| if (rb_block_arity() > 1)
| |
| rb_hash_foreach(hash, each_pair_i_fast, 0);
| |
| else
| |
| rb_hash_foreach(hash, each_pair_i, 0);
| |
| return hash;
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
| ====<code>each_value {| value | block } → hsh</code>====
| |
| ====<code>each_value → an_enumerator</code>====
| |
| استدعاء <code>block</code> مرة واحدة لكل مفتاح في <code>hsh</code>، وتمرير المفتاح كمعامل.
| |
| | |
| إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك.<syntaxhighlight lang="ruby">
| |
| h = { "a" => 100, "b" => 200 }
| |
| h.each_value {|value| puts value }
| |
| </syntaxhighlight>يُنتِج:<syntaxhighlight lang="ruby">
| |
| 100
| |
| 200
| |
| </syntaxhighlight>أمثلة<syntaxhighlight lang="ruby">
| |
|
| |
| static VALUE
| |
| rb_hash_each_value(VALUE hash)
| |
| {
| |
| RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
| |
| rb_hash_foreach(hash, each_value_i, 0);
| |
| return hash;
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
| ====<code>empty? → true or false</code>====
| |
| إعادة <code>true</code> إذا كانت <code>hsh</code> لا تحتوي على أزواج القيمة-المفتاح.<syntaxhighlight lang="ruby">
| |
| {}.empty? #=> true
| |
| | |
| </syntaxhighlight>أمثلة<syntaxhighlight lang="ruby">
| |
|
| |
| static VALUE
| |
| rb_hash_empty_p(VALUE hash)
| |
| {
| |
| return RHASH_EMPTY_P(hash) ? Qtrue : Qfalse;
| |
| }
| |
| </syntaxhighlight>
| |
| ====<code>eql?(other) → true or false</code>====
| |
| إعادة <code>true</code> إذا كان كلٌ من <code>hash</code> و <code>other</code> تجزئتين بنفس المحتوى. لا يقارن ترتيب كل التجزئات.
| |
| | |
| أمثلة<syntaxhighlight lang="ruby">
| |
|
| |
| static VALUE
| |
| rb_hash_eql(VALUE hash1, VALUE hash2)
| |
| {
| |
| return hash_equal(hash1, hash2, TRUE);
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
| ====<code>fetch(key [, default] ) → obj</code>====
| |
| ====<code>fetch(key) {| key | block } → obj</code>====
| |
| إعادة قيمة من التجزئة لمفتاح معين. إذا كان المفتاح غير موجود، هناك عدة خيارات: مع عدم وجود وسائط أخرى، سيُجرى استثناء <code>KeyError</code>، إذا أُعطيَ <code>default</code>، ستُعاد هذه إذا حُدِدت كتلة الشيفرة البرمجية الاختيارية، ثم ستُنفَّذ وتُعاد نتيجتها.<syntaxhighlight lang="ruby">
| |
| h = { "a" => 100, "b" => 200 }
| |
| h.fetch("a") #=> 100
| |
| h.fetch("z", "go fish") #=> "go fish"
| |
| h.fetch("z") { |el| "go fish, #{el}"} #=> "go fish, z"
| |
| </syntaxhighlight>يُظهِر المثال التالي إجراء استثناء إذا كان المفتاح غير موجود ولم تُعطى قيمة افتراضية.<syntaxhighlight lang="ruby">
| |
| h = { "a" => 100, "b" => 200 }
| |
| h.fetch("z")
| |
| </syntaxhighlight>يُنتِج:<syntaxhighlight lang="ruby">
| |
| prog.rb:2:in `fetch': key not found (KeyError)
| |
| from prog.rb:2
| |
| </syntaxhighlight>أمثلة<syntaxhighlight lang="ruby">
| |
|
| |
| static VALUE
| |
| rb_hash_fetch_m(int argc, VALUE *argv, VALUE hash)
| |
| {
| |
| VALUE key;
| |
| st_data_t val;
| |
| long block_given;
| |
| | |
| rb_check_arity(argc, 1, 2);
| |
| key = argv[0];
| |
| | |
| block_given = rb_block_given_p();
| |
| if (block_given && argc == 2) {
| |
| rb_warn("block supersedes default value argument");
| |
| }
| |
| if (!RHASH(hash)->ntbl || !st_lookup(RHASH(hash)->ntbl, key, &val)) {
| |
| if (block_given) return rb_yield(key);
| |
| if (argc == 1) {
| |
| VALUE desc = rb_protect(rb_inspect, key, 0);
| |
| if (NIL_P(desc)) {
| |
| desc = rb_any_to_s(key);
| |
| }
| |
| desc = rb_str_ellipsize(desc, 65);
| |
| rb_key_err_raise(rb_sprintf("key not found: %"PRIsVALUE, desc), hash, key);
| |
| }
| |
| return argv[1];
| |
| }
| |
| return (VALUE)val;
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
| ====<code>fetch_values(key, ...) → array</code>====
| |
| ====<code>fetch_values(key, ...) { |key| block } → array</code>====
| |
| إعادة مصفوفة تحتوي على القيم المقترنة بالمفاتيح المعطاة ولكن تُجرى أيضًا <code>KeyError</code> عند تعذر العثور على أحد المفاتيح. راجع أيضًا <code>Hash#values_at</code> و <code>Hash#fetch</code>.<syntaxhighlight lang="ruby">
| |
| h = { "cat" => "feline", "dog" => "canine", "cow" => "bovine" }
| |
| | |
| h.fetch_values("cow", "cat") #=> ["bovine", "feline"]
| |
| h.fetch_values("cow", "bird") # raises KeyError
| |
| h.fetch_values("cow", "bird") { |k| k.upcase } #=> ["bovine", "BIRD"]
| |
| </syntaxhighlight>أمثلة<syntaxhighlight lang="ruby">
| |
|
| |
| VALUE
| |
| rb_hash_fetch_values(int argc, VALUE *argv, VALUE hash)
| |
| {
| |
| VALUE result = rb_ary_new2(argc);
| |
| long i;
| |
| | |
| for (i=0; i<argc; i++) {
| |
| rb_ary_push(result, rb_hash_fetch(hash, argv[i]));
| |
| }
| |
| return result;
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
| ====<code>flatten → an_array</code>====
| |
| ====<code>flatten(level) → an_array</code>====
| |
| إعادة مصفوفة جديدة والتي تكون تسطيح أحادي الأبعاد لهذا التجزئة. أي أن لكل مفتاح أو قيمة تكون مصفوفة، تستخرج عناصرها إلى مصفوفة جديدة. على عكس <code>Array#flatten</code>، لا يُسطِّح هذا التابع بشكل عَودي افتراضيًا. يُحدد الوسيط الاختياري <code>level</code> مستوى عودية التسطح.<syntaxhighlight lang="ruby">
| |
| a = {1=> "one", 2 => [2,"two"], 3 => "three"}
| |
| a.flatten # => [1, "one", 2, [2, "two"], 3, "three"]
| |
| a.flatten(2) # => [1, "one", 2, 2, "two", 3, "three"]
| |
| </syntaxhighlight>أمثلة<syntaxhighlight lang="ruby">
| |
|
| |
| static VALUE
| |
| rb_hash_flatten(int argc, VALUE *argv, VALUE hash)
| |
| {
| |
| VALUE ary;
| |
| | |
| rb_check_arity(argc, 0, 1);
| |
| | |
| if (argc) {
| |
| int level = NUM2INT(argv[0]);
| |
| | |
| if (level == 0) return rb_hash_to_a(hash);
| |
| | |
| ary = rb_ary_new_capa(RHASH_SIZE(hash) * 2);
| |
| rb_hash_foreach(hash, flatten_i, ary);
| |
| level--;
| |
| | |
| if (level > 0) {
| |
| VALUE ary_flatten_level = INT2FIX(level);
| |
| rb_funcallv(ary, id_flatten_bang, 1, &ary_flatten_level);
| |
| }
| |
| else if (level < 0) {
| |
| /* flatten recursively */
| |
| rb_funcallv(ary, id_flatten_bang, 0, 0);
| |
| }
| |
| }
| |
| else {
| |
| ary = rb_ary_new_capa(RHASH_SIZE(hash) * 2);
| |
| rb_hash_foreach(hash, flatten_i, ary);
| |
| }
| |
| | |
| return ary;
| |
| }
| |
| </syntaxhighlight>
| |
| ====<code>has_key?(key) → true or false</code>====
| |
| إعادة <code>true</code> إذا كان مفتاح معين موجود في <code>hsh</code>.<syntaxhighlight lang="ruby">
| |
| h = { "a" => 100, "b" => 200 }
| |
| h.has_key?("a") #=> true
| |
| h.has_key?("z") #=> false
| |
| </syntaxhighlight>علمًا بأن <code>include?</code> و <code>member?</code> لا يختبرا تساوي الأعضاء باستخدام <code>==</code> كما تفعل غيرها من العدَّادات.
| |
| | |
| راجع أيضًا <code>[[Ruby/Enumerable|Enumerable#include?]]</code>
| |
| | |
| أمثلة<syntaxhighlight lang="ruby">
| |
| | |
| VALUE
| |
| rb_hash_has_key(VALUE hash, VALUE key)
| |
| {
| |
| if (!RHASH(hash)->ntbl)
| |
| return Qfalse;
| |
| if (st_lookup(RHASH(hash)->ntbl, key, 0)) {
| |
| return Qtrue;
| |
| }
| |
| return Qfalse;
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
| ====<code>has_value?(value) → true or false</code>====
| |
| إعادة <code>true</code> إذا كانت القيمة المُعطاة موجودة لمفتاح ما في <code>hsh</code>.<syntaxhighlight lang="ruby">
| |
| h = { "a" => 100, "b" => 200 }
| |
| h.value?(100) #=> true
| |
| h.value?(999) #=> false
| |
| </syntaxhighlight>أمثلة<syntaxhighlight lang="ruby">
| |
|
| |
| static VALUE
| |
| rb_hash_has_value(VALUE hash, VALUE val)
| |
| {
| |
| VALUE data[2];
| |
| | |
| data[0] = Qfalse;
| |
| data[1] = val;
| |
| rb_hash_foreach(hash, rb_hash_search_value, (VALUE)data);
| |
| return data[0];
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
| ====<code>hash → integer</code>====
| |
| حساب رمز التجزئة لهذه التجزئة. سيكون لتجزئتين لهما نفس المحتوى نفس رمز التجزئة (وستقارن باستخدام <code>eql?</code>).
| |
| | |
| راجع أيضًا <code>Object#hash</code>.
| |
| | |
| أمثلة<syntaxhighlight lang="ruby">
| |
|
| |
| static VALUE
| |
| rb_hash_hash(VALUE hash)
| |
| {
| |
| st_index_t size = RHASH_SIZE(hash);
| |
| st_index_t hval = rb_hash_start(size);
| |
| hval = rb_hash_uint(hval, (st_index_t)rb_hash_hash);
| |
| if (size) {
| |
| rb_hash_foreach(hash, hash_i, (VALUE)&hval);
| |
| }
| |
| hval = rb_hash_end(hval);
| |
| return ST2FIX(hval);
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
| ====<code>include?(key) → true or false</code>====
| |
| إعادة <code>true</code> إذا كان مفتاح معين موجود في <code>hsh</code>.<syntaxhighlight lang="ruby">
| |
| h = { "a" => 100, "b" => 200 }
| |
| h.has_key?("a") #=> true
| |
| h.has_key?("z") #=> false
| |
| </syntaxhighlight>علمًا بأن <code>include?</code> و <code>member?</code> لا يختبرا تساوي الأعضاء باستخدام <code>==</code> كما تفعل غيرها من العدَّادات.
| |
|
| |
|
| راجع أيضًا [[Ruby/Enumerable|<code>Enumerable#include?</code>]]<code></code>
| | ===<code>[[Ruby/Hash/new|new]]</code>=== |
| | ينشئ جدول <code>Hash</code> جديد فارغ ثم يعيده. |
|
| |
|
| أمثلة<syntaxhighlight lang="ruby">
| | ===<code>[[Ruby/Hash/try_convert|try_convert]]</code>=== |
|
| | يحاول تحويل الكائن المُمرَّر إليه إلى النوع <code>Hash</code> باستخدام التابع<code>[[Ruby/Hash/to hash|to_hash]]</code>. |
| VALUE
| |
| rb_hash_has_key(VALUE hash, VALUE key)
| |
| {
| |
| if (!RHASH(hash)->ntbl)
| |
| return Qfalse;
| |
| if (st_lookup(RHASH(hash)->ntbl, key, 0)) {
| |
| return Qtrue;
| |
| }
| |
| return Qfalse;
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
| ====<code>to_s → string</code>====
| |
| ====<code>inspect → string</code>====
| |
| إعادة محتويات هذا التجزئة كسلسلة نصية.<syntaxhighlight lang="ruby">
| |
| h = { "c" => 300, "a" => 100, "d" => 400, "c" => 300 }
| |
| h.to_s #=> "{\"c\"=>300, \"a\"=>100, \"d\"=>400}"
| |
|
| |
|
| </syntaxhighlight>ويُعيَّن له أيضًا الاسم المستعار: <code>to_s</code>.
| | == توابع النسخة العامة == |
|
| |
|
| أمثلة<syntaxhighlight lang="ruby">
| | ===<code>[[Ruby/Hash/lt|>]]</code>=== |
|
| | يعيد القيمة <code>true</code> إذا كان الكائن <code>Hash</code> الواقع على يساره مجموعةً فرعيةً من الكائن الواقع على يمينه. |
| static VALUE
| |
| rb_hash_inspect(VALUE hash)
| |
| {
| |
| if (RHASH_EMPTY_P(hash))
| |
| return rb_usascii_str_new2("{}");
| |
| return rb_exec_recursive(inspect_hash, hash, 0);
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
| ====<code>invert → new_hash</code>====
| |
| إعادة تجزئة جديدة مُنشأة باستخدام قيم <code>hsh</code> كمفاتيح والمفاتيح كقيم. إذا وُجِد بالفعل مفتاح بنفس القيمة في <code>hsh</code>، سيستخدم آخر واحد مُعرَّف، وستُتجاهل القيم السابقة.<syntaxhighlight lang="ruby">
| |
| h = { "n" => 100, "m" => 100, "y" => 300, "d" => 200, "a" => 0 }
| |
| h.invert #=> {0=>"a", 100=>"m", 200=>"d", 300=>"y"}
| |
| </syntaxhighlight>إذا لم يكن هناك مفتاح بنفس القيمة، تكون <code>#invert</code> ذاتية الانعكاس (involutive).<syntaxhighlight lang="ruby">
| |
| h = { a: 1, b: 3, c: 4 }
| |
| h.invert.invert == h #=> true
| |
| </syntaxhighlight>الشرط، ألا يوجد مفتاح بنفس القيمة، ويمكن اختباره بمقارنة حجم التجزئة المقلوبة.<syntaxhighlight lang="ruby"> | |
| # no key with the same value
| |
| h = { a: 1, b: 3, c: 4 }
| |
| h.size == h.invert.size #=> true
| |
|
| |
|
| # two (or more) keys has the same value
| | ===<code>[[Ruby/Hash/le|=>]]</code>=== |
| h = { a: 1, b: 3, c: 1 }
| | يعيد القيمة <code>true</code> إذا كان الكائن <code>Hash</code> الواقع على يساره مجموعةً فرعيةً من الكائن الواقع على يمينه أو يساويه تمامًا. |
| h.size == h.invert.size #=> false
| |
| </syntaxhighlight>أمثلة<syntaxhighlight lang="ruby"> | |
| static VALUE
| |
| rb_hash_invert(VALUE hash)
| |
| {
| |
| VALUE h = rb_hash_new_with_size(RHASH_SIZE(hash));
| |
|
| |
|
| rb_hash_foreach(hash, rb_hash_invert_i, h);
| | ===<code>[[Ruby/Hash/equal|==]]</code>=== |
| return h;
| | يتحقق من تساوي كائنين من النوع <code>Hash</code>. |
| }
| |
|
| |
| </syntaxhighlight>
| |
| ====<code>keep_if {| key, value | block } → hsh</code>====
| |
| ====<code>keep_if → an_enumerator</code>====
| |
| حذف كل أزواج القيمة-المفتاح من <code>hsh</code> والتي تقيَّم لها <code>block</code> بالقيمة <code>false</code>.
| |
|
| |
|
| إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك.
| | ===<code>[[Ruby/Hash/gt|<]]</code>=== |
| | يعيد القيمة <code>true</code> إذا كان الكائن الواقع على يمينه مجموعةً فرعيةً من الكائن الواقع على يساره. |
|
| |
|
| أمثلة<syntaxhighlight lang="ruby">
| | ===<code>[[Ruby/Hash/ge|=<]]</code>=== |
| | يعيد المعامل <code>=<</code> القيمة <code>true</code> إذا كان الكائن الواقع على يمينه مجموعةً فرعيةً من الكائن الواقع على يساره أو يساويه تمامًا. |
|
| |
|
| VALUE
| | ===<code>[[Ruby/Hash/5B-5D|[]]]</code>=== |
| rb_hash_keep_if(VALUE hash)
| | يجلب القيمة المقابلة لمفتاح معين في الجدول <code>Hash</code> المعطى. |
| {
| |
| RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
| |
| rb_hash_modify_check(hash);
| |
| if (RHASH(hash)->ntbl)
| |
| rb_hash_foreach(hash, keep_if_i, hash);
| |
| return hash;
| |
| }
| |
| </syntaxhighlight>
| |
| ====<code>key(value) → key</code>====
| |
| إعادة مفتاح تواجد قيمة معينة. ويُعيد <code>nil</code> إذا كانت القيمة غير موجود.<syntaxhighlight lang="ruby">
| |
| h = { "a" => 100, "b" => 200, "c" => 300, "d" => 300 }
| |
| h.key(200) #=> "b"
| |
| h.key(300) #=> "c"
| |
| h.key(999) #=> nil
| |
| </syntaxhighlight>أمثلة<syntaxhighlight lang="ruby">
| |
|
| |
|
| static VALUE
| | ===<code>[[Ruby/Hash/5B-5D-3D|=[]]]</code>=== |
| rb_hash_key(VALUE hash, VALUE value)
| | يربط عند استدعائه بالشكل <code>hsh[key] = value</code> القيمة <code>value</code> المعطاة بالمفتاح<code>key</code> في الجدول <code>Hash</code>. |
| {
| |
| VALUE args[2];
| |
|
| |
|
| args[0] = value;
| | ===<code>[[Ruby/Hash/any-3F|any?]]</code>=== |
| args[1] = Qnil;
| | يمرر كل زوج من مفتاح/قيمة من أزواج الكائن <code>[[Ruby/Hash|Hash]]</code> المعطى إلى كتلة معينة ثم يعيد القيمة <code>true</code> إن أعادت الكتلة قيمة غير القيمة <code>false</code> أو <code>nil</code>. |
| | |
| rb_hash_foreach(hash, key_i, (VALUE)args);
| |
| | |
| return args[1];
| |
| }
| |
| </syntaxhighlight>
| |
| ====<code>key?(key) → true or false</code>====
| |
| إعادة <code>true</code> إذا كان مفتاح معين موجود في <code>hsh</code>.<syntaxhighlight lang="ruby">
| |
| h = { "a" => 100, "b" => 200 }
| |
| h.has_key?("a") #=> true
| |
| h.has_key?("z") #=> false
| |
| </syntaxhighlight>علمًا بأن <code>include?</code> و <code>member?</code> لا يختبرا تساوي الأعضاء باستخدام <code>==</code> كما تفعل غيرها من العدَّادات. | |
|
| |
|
| راجع أيضًا <code>[[Ruby/Enumerable|Enumerable#include?]]</code>[[Ruby/Enumerable|]].
| | ===<code>[[Ruby/Hash/assoc|assoc]]</code>=== |
| | يبحث ضمن الكائن <code>[[Ruby/Hash|Hash]]</code> عن طريق موازنة الكائن المُمرَّر إليه بمفاتيحه باستخدام المعامل <code>[[Ruby/Hash/equal|==]]</code> ثم يعيد الزوج قيمة-مفتاح (مصفوفة من عنصرين) أو <code>nil</code> إذا لم يعثر على أي تطابق. |
|
| |
|
| أمثلة<syntaxhighlight lang="ruby">
| | ===<code>[[Ruby/Hash/clear|clear]]</code>=== |
|
| | يزيل جميع الأزواج قيمة-مفتاح من الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه. |
| VALUE
| |
| rb_hash_has_key(VALUE hash, VALUE key)
| |
| {
| |
| if (!RHASH(hash)->ntbl)
| |
| return Qfalse;
| |
| if (st_lookup(RHASH(hash)->ntbl, key, 0)) {
| |
| return Qtrue;
| |
| }
| |
| return Qfalse;
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
| ====<code>keys → array</code>====
| |
| إعادة مصفوفة جديدة ممتلئة بالمفاتيح من هذه التجزئة. راجع أيضًا <code>Hash#values</code>.<syntaxhighlight lang="ruby">
| |
| h = { "a" => 100, "b" => 200, "c" => 300, "d" => 400 }
| |
| h.keys #=> ["a", "b", "c", "d"]
| |
| </syntaxhighlight>أمثلة<syntaxhighlight lang="ruby">
| |
|
| |
| VALUE
| |
| rb_hash_keys(VALUE hash)
| |
| {
| |
| VALUE keys;
| |
| st_index_t size = RHASH_SIZE(hash);
| |
|
| |
|
| keys = rb_ary_new_capa(size);
| | ===<code>[[Ruby/Hash/compact|compact]]</code>=== |
| if (size == 0) return keys;
| | يعيد كائن <code>Hash</code> جديد يحوي جميع الأزواج قيم/مفاتيح للكائن الذي استدعي معه باستثناء الأزواج المعدومة (أي ذات القيمة <code>nil</code>). |
|
| |
|
| if (ST_DATA_COMPATIBLE_P(VALUE)) {
| | ===<code>[[Ruby/Hash/compact!|compact!]]</code>=== |
| st_table *table = RHASH(hash)->ntbl;
| | يزيل جميع الأزواج قيمة/مفتاح المعدومة (أي ذات القيمة <code>nil</code>) من الكائن الذي استدعي معه. |
|
| |
|
| rb_gc_writebarrier_remember(keys);
| | ===<code>[[Ruby/Hash/compare_by_identity|compare_by_identity]]</code>=== |
| RARRAY_PTR_USE(keys, ptr, {
| | يجعل الكائن <code>[[Ruby/Hash|Hash]]</code> يقارن مفاتيحه بواسطة مُعرِّفاتها، أي أنَّها سوف تُعدُّ نفس الكائنات على أنَّها نفس المفاتيح. |
| size = st_keys(table, ptr, size);
| |
| });
| |
| rb_ary_set_len(keys, size);
| |
| }
| |
| else {
| |
| rb_hash_foreach(hash, keys_i, keys);
| |
| }
| |
|
| |
|
| return keys;
| | ===<code>[[Ruby/Hash/compare_by_identity-3F|compare_by_identity?]]</code>=== |
| }
| | يتحقق إذا كان الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه سيقارن مفاتيحه بواسطة مُعرِّفاتهم. |
|
| |
| </syntaxhighlight>
| |
| ====<code>length → integer</code>====
| |
| إعادة عدد أزواج القيمة-المفتاح في التجزئة.<syntaxhighlight lang="ruby">
| |
| h = { "d" => 100, "a" => 200, "v" => 300, "e" => 400 }
| |
| h.length #=> 4
| |
| h.delete("a") #=> 200
| |
| h.length #=> 3
| |
| </syntaxhighlight>أمثلة<syntaxhighlight lang="ruby">
| |
|
| |
| VALUE
| |
| rb_hash_size(VALUE hash)
| |
| {
| |
| return INT2FIX(RHASH_SIZE(hash));
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
| ====<code>member?(key) → true or false</code>====
| |
| إعادة <code>true</code> إذا كان مفتاح معين موجود في <code>hsh</code>.<syntaxhighlight lang="ruby">
| |
| h = { "a" => 100, "b" => 200 }
| |
| h.has_key?("a") #=> true
| |
| h.has_key?("z") #=> false
| |
| </syntaxhighlight>علمًا بأن <code>include?</code> و <code>member?</code> لا يختبرا تساوي الأعضاء باستخدام <code>==</code> كما تفعل غيرها من العدَّادات.
| |
|
| |
|
| راجع أيضًا <code>[[Ruby/Enumerable|Enumerable#include?]]</code>.
| | ===<code>[[Ruby/Hash/default|default]]</code>=== |
| | يعيد القيمة الافتراضية للمفتاح المُمرَّر إليه؛ أي يعيد القيمة التي سيعيدها الكائن<code>[[Ruby/Hash|Hash]]</code> إذا كان المفتاح غير موجود فيه. |
|
| |
|
| أمثلة<syntaxhighlight lang="ruby">
| | ===[[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>. |
| VALUE
| |
| rb_hash_has_key(VALUE hash, VALUE key)
| |
| {
| |
| if (!RHASH(hash)->ntbl)
| |
| return Qfalse;
| |
| if (st_lookup(RHASH(hash)->ntbl, key, 0)) {
| |
| return Qtrue;
| |
| }
| |
| return Qfalse;
| |
| }
| |
| </syntaxhighlight> | |
| ====<code>merge(other_hash) → new_hash</code>==== | |
| <code>merge(other_hash){|key, oldval, newval| block} → new_hash</code> | |
|
| |
|
| إعادة تجزئة جديدة تحتوي على محتويات <code>other_hash</code> ومحتويات <code>hsh</code>. إذا لم تُحدد أي كتلة، ستكون قيمة العناصر ذات المفاتيح المُكررة هي نفسها من <code>other_hash</code>. وإلا تُحدَد قيمة كل مفتاح مكرر عن طريق استدعاء الكتلة مع المفتاح، وتكون قيمته في <code>hsh</code> وقيمته في <code>other_hash</code>.<syntaxhighlight lang="ruby">
| | ===<code>[[Ruby/Hash/default_proc|default_proc]]</code>=== |
| h1 = { "a" => 100, "b" => 200 }
| | يعيد الكتلة التي استُدعي التابع <code>[[Ruby/Hash/new|new]]</code> معها عند إنشاء الكائن <code>[[Ruby/Hash|Hash]]</code>المعطى، وإلا سيُعيد القيمة <code>nil</code>. |
| h2 = { "b" => 254, "c" => 300 }
| |
| h1.merge(h2) #=> {"a"=>100, "b"=>254, "c"=>300}
| |
| h1.merge(h2){|key, oldval, newval| newval - oldval}
| |
| #=> {"a"=>100, "b"=>54, "c"=>300}
| |
| h1 #=> {"a"=>100, "b"=>200}
| |
| </syntaxhighlight>أمثلة<syntaxhighlight lang="ruby"> | |
|
| |
| static VALUE
| |
| rb_hash_merge(VALUE hash1, VALUE hash2)
| |
| {
| |
| return rb_hash_update(rb_hash_dup(hash1), hash2);
| |
| }
| |
| </syntaxhighlight>
| |
| ====<code>merge!(other_hash) → hsh</code>====
| |
| ====<code>merge!(other_hash){|key, oldval, newval| block} → hsh</code>====
| |
| إضافة محتويات <code>other_hash</code> إلى <code>hsh</code>. إذا لم تُحدَد أي كتلة، يُكتب فوق الإدخالات ذات المفاتيح المكررة مع القيم من <code>other_hash</code>، وإلا تُحدَّد قيمة كل مفتاح مكرر عن طريق استدعاء الكتلة مع المفتاح وقيمته في <code>hsh</code> وقيمته في <code>other_hash</code>.<syntaxhighlight lang="ruby">
| |
| h1 = { "a" => 100, "b" => 200 }
| |
| h2 = { "b" => 254, "c" => 300 }
| |
| h1.merge!(h2) #=> {"a"=>100, "b"=>254, "c"=>300}
| |
| h1 #=> {"a"=>100, "b"=>254, "c"=>300}
| |
|
| |
|
| h1 = { "a" => 100, "b" => 200 }
| | ===<code>[[Ruby/Hash/default_proc-3D|=default_proc]]</code>=== |
| h2 = { "b" => 254, "c" => 300 }
| | يضبط إن استدعي بالشكل <code>default_proc = proc_obj</code> القيمة الافتراضية للكتلة التي ستُنفَّذ عند فشل أية عملية بحث عن مفتاح للكائن <code>[[Ruby/Hash|Hash]]</code> المعطى. |
| h1.merge!(h2) { |key, v1, v2| v1 }
| |
| #=> {"a"=>100, "b"=>200, "c"=>300}
| |
| h1 #=> {"a"=>100, "b"=>200, "c"=>300}
| |
| </syntaxhighlight>أمثلة<syntaxhighlight lang="ruby">
| |
|
| |
| static VALUE
| |
| rb_hash_update(VALUE hash1, VALUE hash2)
| |
| {
| |
| rb_hash_modify(hash1);
| |
| hash2 = to_hash(hash2);
| |
| if (rb_block_given_p()) {
| |
| rb_hash_foreach(hash2, rb_hash_update_block_i, hash1);
| |
| }
| |
| else {
| |
| rb_hash_foreach(hash2, rb_hash_update_i, hash1);
| |
| }
| |
| return hash1;
| |
| }
| |
| </syntaxhighlight>
| |
| ====<code>rassoc(obj) → an_array or nil</code>==== | |
| البحث خلال التجزئة عن طريق مقارنة <code>obj</code> بالقيمة باستخدام <code>==</code>. إعادة أول زوج القيمة-المفتاح (مصفوفة من عنصرين) يتطابق. راجع أيضًا <code>Array#rassoc</code>.<syntaxhighlight lang="ruby">
| |
| a = {1=> "one", 2 => "two", 3 => "three", "ii" => "two"}
| |
| a.rassoc("two") #=> [2, "two"]
| |
| a.rassoc("four") #=> nil
| |
| </syntaxhighlight>أمثلة<syntaxhighlight lang="ruby">
| |
|
| |
| VALUE
| |
| rb_hash_rassoc(VALUE hash, VALUE obj)
| |
| {
| |
| VALUE args[2];
| |
|
| |
|
| args[0] = obj;
| | ===<code>[[Ruby/Hash/delete|delete]]</code>=== |
| args[1] = Qnil;
| | يحذف زوجًا ذا مفتاح محدَّد ويعيد قيمته من الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه. |
| rb_hash_foreach(hash, rassoc_i, (VALUE)args);
| |
| return args[1];
| |
| }
| |
| </syntaxhighlight>
| |
| ====<code>rehash → hsh</code>====
| |
| إعادة بناء التجزئة استنادًا إلى قيم التجزئة الحالية لكل مفتاح. إذا تغيرت قيم كائنات المفاتيح منذ إدراجها، سيعيد هذا التابع فهرسة <code>hsh</code>. إذا اُستدعيَ <code>Hash#rehash</code> بينما يجتاز مُكرِّر التجزئة، سينطلق <code>RuntimeError</code> في المُكرِّر.<syntaxhighlight lang="ruby">
| |
| a = [ "a", "b" ]
| |
| c = [ "c", "d" ]
| |
| h = { a => 100, c => 300 }
| |
| h[a] #=> 100
| |
| a[0] = "z"
| |
| h[a] #=> nil
| |
| h.rehash #=> {["z", "b"]=>100, ["c", "d"]=>300}
| |
| h[a] #=> 100
| |
| </syntaxhighlight>أمثلة<syntaxhighlight lang="ruby">
| |
|
| |
| VALUE
| |
| rb_hash_rehash(VALUE hash)
| |
| {
| |
| VALUE tmp;
| |
| st_table *tbl;
| |
|
| |
|
| if (RHASH_ITER_LEV(hash) > 0) {
| | ===<code>[[Ruby/Hash/delete_if|delete_if]]</code>=== |
| rb_raise(rb_eRuntimeError, "rehash during iteration");
| | يحذف كل زوج قيمة-مفتاح يحقق شرطًا معيَّنًا من أزواج الكائن <code>[[Ruby/Hash|Hash]]</code> المعطى. |
| }
| |
| rb_hash_modify_check(hash);
| |
| if (!RHASH(hash)->ntbl)
| |
| return hash;
| |
| tmp = hash_alloc(0);
| |
| tbl = st_init_table_with_size(RHASH(hash)->ntbl->type, RHASH(hash)->ntbl->num_entries);
| |
| RHASH(tmp)->ntbl = tbl;
| |
|
| |
|
| rb_hash_foreach(hash, rb_hash_rehash_i, (VALUE)tbl);
| | ===<code>[[Ruby/Hash/dig|dig]]</code>=== |
| st_free_table(RHASH(hash)->ntbl);
| | يستخرج القيمة المتداخلة المحددة بواسطة تسلسل كائنات تمثِّل المفاتيح عن طريق استدعاء <code>dig</code> في كل خطوة، ويعيد القيمة <code>nil</code> إذا كانت أي خطوة متوسطة هي <code>nil</code>. |
| RHASH(hash)->ntbl = tbl;
| |
| RHASH(tmp)->ntbl = 0;
| |
|
| |
|
| return hash;
| | ===<code>[[Ruby/Hash/each|each]]</code>=== |
| }
| | يستدعي الكتلة المعطاة مرةً واحدةً لكل مفتاح من مفاتيح أزواج الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه بعد تمرير مفتاح وقيمة الأزواج إليها. |
|
| |
| </syntaxhighlight>
| |
| ====<code>reject {|key, value| block} → a_hash</code>====
| |
| ====<code>reject → an_enumerator</code>====
| |
| إعادة تجزئة جديدة تتكون من العناصر التي تعيد الكتلة لها <code>false</code>.
| |
|
| |
|
| إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك.<syntaxhighlight lang="ruby">
| | ===<code>[[Ruby/Hash/each_key|each_key]]</code>=== |
| h = { "a" => 100, "b" => 200, "c" => 300 }
| | يستدعي الكتلة المعطاة مرةً واحدةً لكل مفتاح من مفاتيح أزواج الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه بعد تمرير مفتاح كل زوج إليها. |
| h.reject {|k,v| k < "b"} #=> {"b" => 200, "c" => 300}
| |
| h.reject {|k,v| v > 100} #=> {"a" => 100}
| |
| </syntaxhighlight>أمثلة<syntaxhighlight lang="ruby"> | |
|
| |
| VALUE
| |
| rb_hash_reject(VALUE hash)
| |
| {
| |
| VALUE result;
| |
|
| |
|
| RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
| | ===<code>[[Ruby/Hash/each_pair|each_pair]]</code>=== |
| if (RTEST(ruby_verbose)) {
| | يستدعي الكتلة المعطاة مرةً واحدةً لكل مفتاح من مفاتيح أزواج الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه بعد تمرير مفتاح وقيمة الأزواج إليها. |
| VALUE klass;
| |
| if (HAS_EXTRA_STATES(hash, klass)) {
| |
| rb_warn("extra states are no longer copied: %+"PRIsVALUE, hash);
| |
| }
| |
| }
| |
| result = rb_hash_new();
| |
| if (!RHASH_EMPTY_P(hash)) {
| |
| rb_hash_foreach(hash, reject_i, result);
| |
| }
| |
| return result;
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
| ====<code>reject! {| key, value | block } → hsh or nil</code>====
| |
| ====<code>reject! → an_enumerator</code>====
| |
| يعادل <code>Hash#delete_if</code>، ولكن يُعيد <code>nil</code> إذا لم تُجرى أية تغييرات.
| |
|
| |
|
| أمثلة<syntaxhighlight lang="ruby">
| | ===<code>[[Ruby/Hash/each_value|each_value]]</code>=== |
|
| | يستدعي الكتلة المعطاة مرةً واحدةً لكل مفتاح من مفاتيح أزواج الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه بعد تمرير قيمة كل زوج إليها. |
| VALUE
| |
| rb_hash_reject_bang(VALUE hash)
| |
| {
| |
| st_index_t n;
| |
|
| |
|
| RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
| | ===<code>[[Ruby/Hash/empty-3F|empty?]]</code>=== |
| rb_hash_modify(hash);
| | يتحقق إذا كان الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه فارغًا أي لا يحتوي على أية أزواج. |
| n = RHASH_SIZE(hash);
| |
| if (!n) return Qnil;
| |
| rb_hash_foreach(hash, delete_if_i, hash);
| |
| if (n == RHASH(hash)->ntbl->num_entries) return Qnil;
| |
| return hash;
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
| ====<code>replace(other_hash) → hsh</code>====
| |
| استبدال محتويات <code>hsh</code> بمحتويات <code>other_hash</code>.<syntaxhighlight lang="ruby">
| |
| h = { "a" => 100, "b" => 200 }
| |
| h.replace({ "c" => 300, "d" => 400 }) #=> {"c"=>300, "d"=>400}
| |
| </syntaxhighlight>أمثلة<syntaxhighlight lang="ruby">
| |
|
| |
| static VALUE
| |
| rb_hash_replace(VALUE hash, VALUE hash2)
| |
| {
| |
| st_table *table2;
| |
|
| |
|
| rb_hash_modify_check(hash);
| | ===<code>[[Ruby/Hash/eql-3F|eql?]]</code>=== |
| if (hash == hash2) return hash;
| | يتحقق إذا كان كائنان من نفس النوع (النوع <code>[[Ruby/Hash|Hash]]</code>) ولهما نفس المحتوى. لا يؤخذ ترتيب الأزواج بالحسبان. |
| hash2 = to_hash(hash2);
| |
|
| |
|
| COPY_DEFAULT(hash, hash2);
| | ===<code>[[Ruby/Hash/fetch|fetch]]</code>=== |
| | يعيد قيمة من الكائن <code>[[Ruby/Hash|Hash]]</code> لمفتاح معين. |
|
| |
|
| table2 = RHASH(hash2)->ntbl;
| | ===<code>[[Ruby/Hash/fetch_values|fetch_values]]</code>=== |
| | يعيد مصفوفة تحتوي على القيم المقترنة بالمفاتيح المعطاة. |
|
| |
|
| rb_hash_clear(hash);
| | ===<code>[[Ruby/Hash/flatten|flatten]]</code>=== |
| if (table2) hash_tbl(hash)->type = table2->type;
| | يعيد مصفوفة جديدة والتي تكون تسطيح أحادي الأبعاد للكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه. |
| rb_hash_foreach(hash2, replace_i, hash);
| |
|
| |
|
| return hash;
| | ===<code>[[Ruby/Hash/has_key-3F|has_key?]]</code>=== |
| }
| | يتحقق إذا كان مفتاحٌ معيَّن موجودًا في الكائن <code>[[Ruby/Hash|Hash]]</code> المعطى. |
|
| |
| </syntaxhighlight>
| |
| ====<code>select {|key, value| block} → a_hash</code>====
| |
| ====<code>select → an_enumerator</code>====
| |
| إعادة تجزئة جديدة تتكون من العناصر التي تعيد الكتلة لها <code>true</code>.
| |
|
| |
|
| إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك.<syntaxhighlight lang="ruby">
| | ===<code>[[Ruby/Hash/has_value-3F|has_value?]]</code>=== |
| h = { "a" => 100, "b" => 200, "c" => 300 }
| | يعيد إذا كانت قيمةٌ معيَّنةٌ موجودةً في الكائن <code>[[Ruby/Hash|Hash]]</code> المعطى ومرتبطة بمفتاح. |
| h.select {|k,v| k > "a"} #=> {"b" => 200, "c" => 300}
| |
| h.select {|k,v| v < 200} #=> {"a" => 100}
| |
| </syntaxhighlight>أمثلة<syntaxhighlight lang="ruby"> | |
|
| |
| VALUE
| |
| rb_hash_select(VALUE hash)
| |
| {
| |
| VALUE result;
| |
|
| |
|
| RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
| | ===<code>[[Ruby/Hash/hash|hash]]</code>=== |
| result = rb_hash_new();
| | يحسب الشيفرة hash للكائن <code>[[Ruby/Hash|Hash]]</code> المستدعى معها. |
| if (!RHASH_EMPTY_P(hash)) {
| |
| rb_hash_foreach(hash, select_i, result);
| |
| }
| |
| return result;
| |
| }
| |
|
| |
|
| </syntaxhighlight>
| | ===<code>[[Ruby/Hash/include-3F|include?]]</code>=== |
| ====<code>select! {| key, value | block } → hsh or nil</code>====
| | يعيد إذا كان مفتاحٌ معيَّن موجودًا في الكائن <code>[[Ruby/Hash|Hash]]</code> المعطى. |
| ====<code>select! → an_enumerator</code>====
| |
| يعادل <code>Hash#keep_if</code>، ولكن يُعيد <code>nil</code> إذا لم تُجرى أية تغييرات.
| |
|
| |
|
| أمثلة<syntaxhighlight lang="ruby">
| | ===<code>[[Ruby/Hash/inspect|inspect]]</code>=== |
|
| | يعيد محتوى الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه في سلسلة نصية. |
| VALUE
| |
| rb_hash_select_bang(VALUE hash)
| |
| {
| |
| st_index_t n;
| |
|
| |
|
| RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
| | ===<code>[[Ruby/Hash/invert|invert]]</code>=== |
| rb_hash_modify_check(hash);
| | يعيد كائن جديد من النوع <code>[[Ruby/Hash|Hash]]</code> يحوي قيم الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه كمفاتيح ومفاتيحه كقيم فيه. |
| if (!RHASH(hash)->ntbl)
| |
| return Qnil;
| |
| n = RHASH(hash)->ntbl->num_entries;
| |
| rb_hash_foreach(hash, keep_if_i, hash);
| |
| if (n == RHASH(hash)->ntbl->num_entries) return Qnil;
| |
| return hash;
| |
| }
| |
| </syntaxhighlight>
| |
| ====<code>shift → anArray or obj</code>====
| |
| يزيل زوج القيمة-المفتاح من <code>hsh</code> ويقوم بإعادتها كمصفوفة من العنصرين <code>[ key, value ]</code>، أو القيمة الافتراضية للتجزئة إذا كانت التجزئة فارغة.<syntaxhighlight lang="ruby">
| |
| h = { 1 => "a", 2 => "b", 3 => "c" }
| |
| h.shift #=> [1, "a"]
| |
| h #=> {2=>"b", 3=>"c"}
| |
| </syntaxhighlight>أمثلة<syntaxhighlight lang="ruby">
| |
|
| |
| static VALUE
| |
| rb_hash_shift(VALUE hash)
| |
| {
| |
| struct shift_var var;
| |
|
| |
|
| rb_hash_modify_check(hash);
| | ===<code>[[Ruby/Hash/keep_if|keep_if]]</code>=== |
| if (RHASH(hash)->ntbl) {
| | يبقي كل زوج قيمة-مفتاح يحقق شرطًا معيَّنًا من أزواج الكائن <code>[[Ruby/Hash|Hash]]</code> المعطى. |
| var.key = Qundef;
| |
| if (RHASH_ITER_LEV(hash) == 0) {
| |
| if (st_shift(RHASH(hash)->ntbl, &var.key, &var.val)) {
| |
| return rb_assoc_new(var.key, var.val);
| |
| }
| |
| }
| |
| else {
| |
| rb_hash_foreach(hash, shift_i_safe, (VALUE)&var);
| |
| if (var.key != Qundef) {
| |
| rb_hash_delete_entry(hash, var.key);
| |
| return rb_assoc_new(var.key, var.val);
| |
| }
| |
| }
| |
| }
| |
| return rb_hash_default_value(hash, Qnil);
| |
| }
| |
| </syntaxhighlight>
| |
| ====<code>size → integer</code>====
| |
| إعادة عدد أزواج القيمة-المفتاح في التجزئة.<syntaxhighlight lang="ruby">
| |
| h = { "d" => 100, "a" => 200, "v" => 300, "e" => 400 }
| |
| h.length #=> 4
| |
| h.delete("a") #=> 200
| |
| h.length #=> 3
| |
| </syntaxhighlight>أمثلة<syntaxhighlight lang="ruby">
| |
|
| |
| VALUE
| |
| rb_hash_size(VALUE hash)
| |
| {
| |
| return INT2FIX(RHASH_SIZE(hash));
| |
| }
| |
| </syntaxhighlight>
| |
| ====<code>slice(*keys) → a_hash</code>====
| |
| إعادة تجزئة تحتوي فقط على المفاتيح المُعطاة وقيمها.<syntaxhighlight lang="ruby">
| |
| h = { a: 100, b: 200, c: 300 }
| |
| h.slice(:a) #=> {:a=>100}
| |
| h.slice(:b, :c, :d) #=> {:b=>200, :c=>300}
| |
| </syntaxhighlight>أمثلة<syntaxhighlight lang="ruby">
| |
|
| |
| static VALUE
| |
| rb_hash_slice(int argc, VALUE *argv, VALUE hash)
| |
| {
| |
| int i;
| |
| VALUE key, value, result;
| |
|
| |
|
| if (argc == 0 || RHASH_EMPTY_P(hash)) {
| | ===<code>[[Ruby/Hash/key|key]]</code>=== |
| return rb_hash_new();
| | يعيد المفتاح المقابل لقيمة معيَّنة في الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه. |
| }
| |
| result = rb_hash_new_with_size(argc);
| |
|
| |
|
| for (i = 0; i < argc; i++) {
| | ===<code>[[Ruby/Hash/key-3F|key?]]</code>=== |
| key = argv[i];
| | يتحقق إذا كان مفتاحٌ محدَّدٌ موجودًا في الكائن <code>[[Ruby/Hash|Hash]]</code> المستدعى معه. |
| value = rb_hash_lookup2(hash, key, Qundef);
| |
| if (value != Qundef)
| |
| rb_hash_aset(result, key, value);
| |
| }
| |
|
| |
|
| return result;
| | ===<code>[[Ruby/Hash/keys|keys]]</code>=== |
| }
| | يعيد مصفوفة جديدة تحوي مفاتيح الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه. |
|
| |
| </syntaxhighlight>
| |
| ==تعيين عنصر==
| |
| ====<code>store(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>أمثلة<syntaxhighlight lang="ruby">
| |
|
| |
| VALUE
| |
| rb_hash_aset(VALUE hash, VALUE key, VALUE val)
| |
| {
| |
| int iter_lev = RHASH_ITER_LEV(hash);
| |
| st_table *tbl = RHASH(hash)->ntbl;
| |
|
| |
|
| rb_hash_modify(hash);
| | ===<code>[[Ruby/Hash/length|length]]</code>=== |
| if (!tbl) {
| | يعيد عدد الأزواج قيمة-مفتاح الموجودة في الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه. |
| if (iter_lev > 0) no_new_key();
| |
| tbl = hash_tbl(hash);
| |
| }
| |
| if (tbl->type == &identhash || rb_obj_class(key) != rb_cString) {
| |
| RHASH_UPDATE_ITER(hash, iter_lev, key, hash_aset, val);
| |
| }
| |
| else {
| |
| RHASH_UPDATE_ITER(hash, iter_lev, key, hash_aset_str, val);
| |
| }
| |
| return val;
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
| ====<code>to_a → array</code>====
| |
| تحويل <code>hsh</code> إلى مصفوفة متداخلة من المصفوفات <code>[ key, value ]</code>.<syntaxhighlight lang="ruby">
| |
| h = { "c" => 300, "a" => 100, "d" => 400, "c" => 300 }
| |
| h.to_a #=> [["c", 300], ["a", 100], ["d", 400]]
| |
| </syntaxhighlight>أمثلة<syntaxhighlight lang="ruby"> | |
|
| |
| static VALUE
| |
| rb_hash_to_a(VALUE hash)
| |
| {
| |
| VALUE ary;
| |
|
| |
|
| ary = rb_ary_new_capa(RHASH_SIZE(hash));
| | ===<code>[[Ruby/Hash/member-3F|member?]]</code>=== |
| rb_hash_foreach(hash, to_a_i, ary);
| | يتحقق إذا كان مفتاحٌ معيَّن موجودًا في الكائن <code>[[Ruby/Hash|Hash]]</code> المعطى. |
| OBJ_INFECT(ary, hash);
| |
|
| |
|
| return ary;
| | ===<code>[[Ruby/Hash/merge|merge]]</code>=== |
| }
| | يدمج كائنين من النوع <code>[[Ruby/Hash|Hash]]</code> مع بعضهما بعضًا في كائن جديد من النوع <code>[[Ruby/Hash|Hash]]</code> ثم يعيده. |
|
| |
| </syntaxhighlight>
| |
| ====<code>to_h → hsh or new_hash</code>====
| |
| إعادة self. إذا استُدعي علي صنف فرعي من <code>[[Ruby/Hash|Hash]]</code>، تحوِّل المُتلقي إلى كائن <code>[[Ruby/Hash|Hash]]</code>.
| |
|
| |
|
| أمثلة<syntaxhighlight lang="ruby">
| | ===<code>[[Ruby/Hash/merge!|merge!]]</code>=== |
| | يضيف محتويات الكائن <code>[[Ruby/Hash|Hash]]</code> الذي مُمرِّر إليه إلى الكائن الذي استدعي معه. |
|
| |
|
| static VALUE
| | ===<code>[[Ruby/Hash/rassoc|rassoc]]</code>=== |
| rb_hash_to_h(VALUE hash)
| | يبحث خلال الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه عن طريق مقارنة القيمة التي مُمرِّرت إليه مع قيم ذلك الكائن باستخدام المعامل <code>[[Ruby/Hash/equal|==]]</code> ثم يعيد أول زوج قيمة-مفتاح متطابق. |
| {
| |
| if (rb_obj_class(hash) != rb_cHash) {
| |
| const VALUE flags = RBASIC(hash)->flags;
| |
| hash = hash_dup(hash, rb_cHash, flags & HASH_PROC_DEFAULT);
| |
| }
| |
| return hash;
| |
| }
| |
|
| |
| </syntaxhighlight> | |
| ====<code>to_hash => hsh</code>====
| |
| إعادة <code>self</code>.
| |
|
| |
|
| أمثلة<syntaxhighlight lang="ruby">
| | ===<code>[[Ruby/Hash/rehash|rehash]]</code>=== |
|
| | يعيد بناء الكائن <code>[[Ruby/Hash|Hash]]</code> استنادًا إلى القيم الحالية لكل مفتاح. |
| static VALUE
| |
| rb_hash_to_hash(VALUE hash)
| |
| {
| |
| return hash;
| |
| }
| |
|
| |
| </syntaxhighlight><code>to_proc()</code> | |
|
| |
|
| أمثلة<syntaxhighlight lang="ruby">
| | ===<code>[[Ruby/Hash/reject|reject]]</code>=== |
|
| | يعيد كائن جديد من النوع <code>[[Ruby/Hash|Hash]]</code> يتكون من الأزواج التي ترفضها الكتلة المعطاة. |
| static VALUE
| |
| rb_hash_to_proc(VALUE hash)
| |
| {
| |
| return rb_func_proc_new(hash_proc_call, hash);
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
| ====<code>to_s()</code>====
| |
| اسم المستعار لـ <code>inspect</code>
| |
|
| |
|
| أمثلة
| | ===<code>[[Ruby/Hash/reject!|reject!]]</code>=== |
| ====<code>transform_keys {|key| block } → new_hash</code>====
| | يحذف الأزواج التي ترفضها الكتلة المعطاة من الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه. |
| ====<code>transform_keys → an_enumerator</code>====
| |
| إعادة تجزئة جديدة مع نتائج تشغيل الكتلة مرة واحدة لكل مفتاح. لا يُغيّر هذا التابع القيم.<syntaxhighlight lang="ruby">
| |
| h = { a: 1, b: 2, c: 3 }
| |
| h.transform_keys {|k| k.to_s } #=> { "a" => 1, "b" => 2, "c" => 3 }
| |
| h.transform_keys(&:to_s) #=> { "a" => 1, "b" => 2, "c" => 3 }
| |
| h.transform_keys.with_index {|k, i| "#{k}.#{i}" }
| |
| #=> { "a.0" => 1, "b.1" => 2, "c.2" => 3 }
| |
| </syntaxhighlight>إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك. | |
|
| |
|
| أمثلة<syntaxhighlight lang="ruby">
| | ===<code>[[Ruby/Hash/replace|replace]]</code>=== |
|
| | يُبدِّل محتويات الكائن المُمرَّر إليه مكان محتويات الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه. |
| static VALUE
| |
| rb_hash_transform_keys(VALUE hash)
| |
| {
| |
| VALUE result;
| |
|
| |
|
| RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
| | ===<code>[[Ruby/Hash/select|select]]</code>=== |
| result = rb_hash_new();
| | يعيد كائن جديد من النوع <code>[[Ruby/Hash|Hash]]</code> يتكون من العناصر التي تعيد الكتلة المعطاة معها القيمة <code>true</code>. |
| if (!RHASH_EMPTY_P(hash)) {
| |
| rb_hash_foreach(hash, transform_keys_i, result);
| |
| }
| |
|
| |
|
| return result;
| | ===<code>[[Ruby/Hash/select!|select!]]</code>=== |
| }
| | يحذف الأزواج التي تقبلها الكتلة المعطاة من الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه. |
| </syntaxhighlight>
| |
| ====<code>transform_keys! {|key| block } → hsh</code>====
| |
| ====<code>transform_keys! → an_enumerator</code>====
| |
| استدعاء الكتلة المعطاة مرة واحدة لكل مفتاح في <code>hsh</code>، واستبداله بالمفتاح الجديد الذي تعيده الكتلة، ثم تُعيد <code>hsh</code>. لا يُغيّر هذا التابع القيم.<syntaxhighlight lang="ruby">
| |
| h = { a: 1, b: 2, c: 3 }
| |
| h.transform_keys! {|k| k.to_s } #=> { "a" => 1, "b" => 2, "c" => 3 }
| |
| h.transform_keys!(&:to_sym) #=> { a: 1, b: 2, c: 3 }
| |
| h.transform_keys!.with_index {|k, i| "#{k}.#{i}" }
| |
| #=> { "a.0" => 1, "b.1" => 2, "c.2" => 3 }
| |
| </syntaxhighlight>إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك.
| |
|
| |
|
| أمثلة<syntaxhighlight lang="ruby">
| | ===<code>[[Ruby/Hash/shift|shift]]</code>=== |
|
| | يزيل زوجًا من قيمة-مفتاح من الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه ويعيده في مصفوفة، أو يعيد القيمة الافتراضية لهذا الكائن إذا كان فارغًا. |
| static VALUE
| |
| rb_hash_transform_keys_bang(VALUE hash)
| |
| {
| |
| RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
| |
| rb_hash_modify_check(hash);
| |
| if (RHASH(hash)->ntbl) {
| |
| long i;
| |
| VALUE pairs = rb_hash_flatten(0, NULL, hash);
| |
| rb_hash_clear(hash);
| |
| for (i = 0; i < RARRAY_LEN(pairs); i += 2) {
| |
| VALUE key = RARRAY_AREF(pairs, i), new_key = rb_yield(key),
| |
| val = RARRAY_AREF(pairs, i+1);
| |
| rb_hash_aset(hash, new_key, val);
| |
| }
| |
| }
| |
| return hash;
| |
| }
| |
| </syntaxhighlight>
| |
| ====<code>transform_values {|value| block } → new_hash</code>====
| |
| ====<code>transform_values → an_enumerator</code>====
| |
| إعادة تجزئة جديدة مع نتائج تشغيل الكتلة مرة واحدة لكل قيمة. لا يُغيّر هذا التابع المفاتيح.<syntaxhighlight lang="ruby">
| |
| h = { a: 1, b: 2, c: 3 }
| |
| h.transform_values {|v| v * v + 1 } #=> { a: 2, b: 5, c: 10 }
| |
| h.transform_values(&:to_s) #=> { a: "1", b: "2", c: "3" }
| |
| h.transform_values.with_index {|v, i| "#{v}.#{i}" }
| |
| #=> { a: "1.0", b: "2.1", c: "3.2" }
| |
| </syntaxhighlight>إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك. | |
|
| |
|
| أمثلة<syntaxhighlight lang="ruby">
| | ===<code>[[Ruby/Hash/size|size]]</code>=== |
|
| | يعيد عدد الأزواج القيمة-المفتاح الموجودة في الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه. |
| static VALUE
| |
| rb_hash_transform_values(VALUE hash)
| |
| {
| |
| VALUE result;
| |
|
| |
|
| RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
| | ===<code>[[Ruby/Hash/slice|slice]]</code>=== |
| result = rb_hash_new_with_size(RHASH_SIZE(hash));
| | يعيد كائنًا من النوع <code>[[Ruby/Hash|Hash]]</code> يحتوي فقط على مفاتيح محدَّدة وقيمها. |
| if (!RHASH_EMPTY_P(hash)) {
| |
| rb_hash_foreach(hash, transform_values_i, result);
| |
| }
| |
|
| |
|
| return result;
| | ===<code>[[Ruby/Hash/store|store]]</code>=== |
| }
| | يربط قيمة محددة مع مفتاح محدد في الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه. |
|
| |
| </syntaxhighlight>
| |
| ====<code>transform_values! {|value| block } → hsh</code>====
| |
| ====<code>transform_values! → an_enumerator</code>====
| |
| استدعاء الكتلة المعطاة مرة واحدة لكل قيمة في <code>hsh</code>، واستبداله بالقيمة الجديدة التي تعيدها الكتلة، ثم تُعيد <code>hsh</code>. لا يُغيّر هذا التابع المفاتيح.<syntaxhighlight lang="ruby">
| |
| h = { a: 1, b: 2, c: 3 }
| |
| h.transform_values! {|v| v * v + 1 } #=> { a: 2, b: 5, c: 10 }
| |
| h.transform_values!(&:to_s) #=> { a: "2", b: "5", c: "10" }
| |
| h.transform_values!.with_index {|v, i| "#{v}.#{i}" }
| |
| #=> { a: "2.0", b: "5.1", c: "10.2" }
| |
| </syntaxhighlight>إذا لم تُعطَى كتلة، يُعاد عدَّاد بدلًا من ذلك. | |
|
| |
|
| أمثلة<syntaxhighlight lang="ruby">
| | ===<code>[[Ruby/Hash/to_a|to_a]]</code>=== |
| | يحول الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه إلى مصفوفة متشعبة من المصفوفات <code>[ key, value ]</code>. |
|
| |
|
| static VALUE
| | ===<code>[[Ruby/Hash/to_h|to_h]]</code>=== |
| rb_hash_transform_values_bang(VALUE hash)
| | يعيد الكائن [[Ruby/Hash|<code>Hash</code>]] المعطى نفسه. إذا استُدعي على صنف فرعي من <code>[[Ruby/Hash|Hash]]</code>، فستحوِّل المستقبل إلى كائن من النوع <code>[[Ruby/Hash|Hash]]</code>. |
| {
| |
| RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
| |
| rb_hash_modify_check(hash);
| |
| if (RHASH(hash)->ntbl)
| |
| rb_hash_foreach(hash, transform_values_i, hash);
| |
| return hash;
| |
| }
| |
| </syntaxhighlight>
| |
| ====<code>update(other_hash) → hsh</code>====
| |
| ====<code>update(other_hash){|key, oldval, newval| block} → hsh</code>====
| |
| إضافة محتويات <code>other_hash</code> إلى <code>hsh</code>. إذا لم تُحدَد أي كتلة، يُكتب فوق الإدخالات ذات المفاتيح المكررة مع القيم من <code>other_hash</code>، وإلا تُحدَّد قيمة كل مفتاح مكرر عن طريق استدعاء الكتلة مع المفتاح وقيمته في <code>hsh</code> وقيمته في <code>other_hash</code>.<syntaxhighlight lang="ruby">
| |
| h1 = { "a" => 100, "b" => 200 }
| |
| h2 = { "b" => 254, "c" => 300 }
| |
| h1.merge!(h2) #=> {"a"=>100, "b"=>254, "c"=>300}
| |
| h1 #=> {"a"=>100, "b"=>254, "c"=>300}
| |
|
| |
|
| h1 = { "a" => 100, "b" => 200 }
| | ===<code>[[Ruby/Hash/to_hash|to_hash]]</code>=== |
| h2 = { "b" => 254, "c" => 300 }
| | يعيد الكائن [[Ruby/Hash|<code>Hash</code>]] المعطى نفسه. |
| h1.merge!(h2) { |key, v1, v2| v1 }
| |
| #=> {"a"=>100, "b"=>200, "c"=>300}
| |
| h1 #=> {"a"=>100, "b"=>200, "c"=>300}
| |
| </syntaxhighlight>أمثلة<syntaxhighlight lang="ruby"> | |
|
| |
|
| static VALUE
| | ===<code>[[Ruby/Hash/to_proc|to_proc]]</code>=== |
| rb_hash_update(VALUE hash1, VALUE hash2)
| | ===<code>[[Ruby/Hash/to_s|to_s]]</code>=== |
| {
| | يعيد محتوى الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه في سلسلة نصية. |
| rb_hash_modify(hash1);
| |
| hash2 = to_hash(hash2);
| |
| if (rb_block_given_p()) {
| |
| rb_hash_foreach(hash2, rb_hash_update_block_i, hash1);
| |
| }
| |
| else {
| |
| rb_hash_foreach(hash2, rb_hash_update_i, hash1);
| |
| }
| |
| return hash1;
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
| ====<code>value?(value) → true or false</code>====
| |
| إعادة <code>true</code> إذا كانت القيمة المُعطاة موجودة لمفتاح ما في <code>hsh</code>.<syntaxhighlight lang="ruby">
| |
| h = { "a" => 100, "b" => 200 }
| |
| h.value?(100) #=> true
| |
| h.value?(999) #=> false
| |
| </syntaxhighlight>أمثلة<syntaxhighlight lang="ruby"> | |
|
| |
|
| static VALUE
| | ===<code>[[Ruby/Hash/transform_keys|transform_keys]]</code>=== |
| rb_hash_has_value(VALUE hash, VALUE val)
| | يعيد كائن جديد من النوع <code>[[Ruby/Hash|Hash]]</code> مع ناتج تنفيذ الكتلة المعطاة مرةً واحدةً لكل مفتاح من مفاتيح الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه. |
| {
| |
| VALUE data[2];
| |
|
| |
|
| data[0] = Qfalse;
| | ===<code>[[Ruby/Hash/transform_keys!|transform_keys!]]</code>=== |
| data[1] = val;
| | يستدعي الكتلة المعطاة مرةً واحدةً لكل مفتاح من مفاتيح الكائن [[Ruby/Hash|<code>Hash</code>]] المعطى، ويستبدل به المفتاح الجديد الذي تعيده الكتلة، ثم يعيد هذا الكائن. |
| rb_hash_foreach(hash, rb_hash_search_value, (VALUE)data);
| |
| return data[0];
| |
| }
| |
| </syntaxhighlight>
| |
| ====<code>values → array</code>====
| |
| إعادة مصفوفة جديدة ممتلئة بالقيم من <code>hsh</code>. راجع أيضًا <code>Hash#keys</code>.<syntaxhighlight lang="ruby">
| |
| h = { "a" => 100, "b" => 200, "c" => 300 }
| |
| h.values #=> [100, 200, 300]
| |
| </syntaxhighlight>أمثلة<syntaxhighlight lang="ruby">
| |
|
| |
| VALUE
| |
| rb_hash_values(VALUE hash)
| |
| {
| |
| VALUE values;
| |
| st_index_t size = RHASH_SIZE(hash);
| |
|
| |
|
| values = rb_ary_new_capa(size);
| | ===<code>[[Ruby/Hash/transform_values|transform_values]]</code>=== |
| if (size == 0) return values;
| | يعيد كائن جديد من النوع <code>[[Ruby/Hash|Hash]]</code> مع ناتج تنفيذ الكتلة المعطاة مرةً واحدةً لكل قيمة من قيم الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه. |
|
| |
|
| if (ST_DATA_COMPATIBLE_P(VALUE)) {
| | ===<code>[[Ruby/Hash/transform_values!|transform_values!]]</code>=== |
| st_table *table = RHASH(hash)->ntbl;
| | يستدعي الكتلة المعطاة مرةً واحدةً لكل قيمة من قيم الكائن [[Ruby/Hash|<code>Hash</code>]] المعطى، ويستبدل به القيمة الجديد التي تعيدها الكتلة، ثم يعيد هذا الكائن. لا يُغيّر هذا التابع المفاتيح. |
|
| |
|
| rb_gc_writebarrier_remember(values);
| | ===<code>[[Ruby/Hash/update|update]]</code>=== |
| RARRAY_PTR_USE(values, ptr, {
| | يضيف محتويات الكائن المُمرَّر إليه إلى الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه. |
| size = st_values(table, ptr, size);
| |
| });
| |
| rb_ary_set_len(values, size);
| |
| }
| |
| else {
| |
| rb_hash_foreach(hash, values_i, values);
| |
| }
| |
|
| |
|
| return values;
| | ===<code>[[Ruby/Hash/value-3F|value?]]</code>=== |
| }
| | يتحقق إذا كانت القيمة المُمرَّرة إليه موجودةً ومرتبطةً بمفتاح ما في الكائن <code>[[Ruby/Hash|Hash]]</code> المعطى. |
|
| |
| </syntaxhighlight>
| |
| ====<code>values_at(key, ...) → array</code>====
| |
| إعادة مصفوفة تحتوي على القيم المرتبطة بالمفاتيح المُعطاة. راجع أيضًا <code>Hash.select</code>.<syntaxhighlight lang="ruby">
| |
| h = { "cat" => "feline", "dog" => "canine", "cow" => "bovine" }
| |
| h.values_at("cow", "cat") #=> ["bovine", "feline"]
| |
| </syntaxhighlight>أمثلة<syntaxhighlight lang="ruby">
| |
|
| |
|
| VALUE
| | ===<code>[[Ruby/Hash/values|values]]</code>=== |
| rb_hash_values_at(int argc, VALUE *argv, VALUE hash)
| | يعيد مصفوفة جديدة تحوي قيم الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه. |
| {
| |
| VALUE result = rb_ary_new2(argc);
| |
| long i;
| |
|
| |
|
| for (i=0; i<argc; i++) {
| | ===<code>[[Ruby/Hash/values_at|values_at]]</code>=== |
| rb_ary_push(result, rb_hash_aref(hash, argv[i]));
| | يعيد مصفوفةً تحتوي على القيم المرتبطة بمفاتيح محدَّدة من الكائن <code>[[Ruby/Hash|Hash]]</code> الذي استدعي معه. |
| }
| |
| return result;
| |
| }
| |
|
| |
| </syntaxhighlight> | |
|
| |
|
| === ملاحظات إضافية ===
| | == ملاحظات إضافية == |
| تأتي بعض التوابع التي يستخدمها البعض مع التجزئة من الوحدة <code>[[Ruby/Enumerable|Enumerable]]</code>. | | تأتي بعض التوابع التي يستخدمها البعض مع الكائن <code>Hash</code> من الوحدة <code>[[Ruby/Enumerable|Enumerable]]</code>. |
|
| |
|
| إذا لم تعثر على ما تبحث عنه في توثيق <code>[[Ruby/Hash|Hash]]</code> ، فراجع توثيق <code>[[Ruby/Enumerable|Enumerable]]</code>. | | إذا لم تعثر على ما تبحث عنه في هذا التوثيق، فاطلع على توثيق <code>[[Ruby/Enumerable|Enumerable]]</code>. |
|
| |
|
| =مصادر= | | =مصادر= |
| * <span> </span>[http://ruby-doc.org/core-2.5.1/Hash.html صفحة Hash في توثيق روبي الرسمي.] | | * <span> </span>[http://ruby-doc.org/core-2.5.1/Hash.html صفحة الصنف Hash في توثيق روبي الرسمي.] |
| [[تصنيف:Ruby]] | | [[تصنيف:Ruby]] |
| [[تصنيف:Ruby Methods]] | | [[تصنيف:Ruby Class]] |
| | [[تصنيف:Ruby Hash]] |