بدائل للتجزئة # المؤشر الذي يعمل دون سابق إنذار في كل من روبي 1.8 و 1.9

StackOverflow https://stackoverflow.com/questions/1810022

  •  05-07-2019
  •  | 
  •  

سؤال

ولقد حصلت على بعض التعليمات البرمجية روبي أنني تحويل الى Ruby 1.9. واحد التحذير أحصل هو Hash#index is deprecated; use Hash#key

ولكن لم يتم تعريف تجزئة # مفتاح في روبي 1.8، لذلك لا يمكن استخدام ذلك مباشرة. هل لدى أي شخص بديل جيد؟

ولقد حصلت على زوجين من الخيارات (التي أنا ما بعد كما أجوبة حتى تتمكن من التصويت)، ولكن أنا على أمل للأفضل.

هل كانت مفيدة؟

المحلول

ويمكنك أيضا عكس التجزئة:

{ :hello => :world }.invert[:world]    # ==> :hello

ولا قرد الترقيع أو الاعتماد على الخارج، ولكن ربما أقل كفاءة بالنسبة لمعظم الأغراض.

نصائح أخرى

وخيار آخر هو monkeypatch:

class Hash
  alias_method(:key, :index) unless method_defined?(:key)
end
require 'backports/1.9.1/hash/key'
{:hello => :world}.key(:world)  # ==> :hello on all ruby versions

يحدد جوهرة كل من روبي 1.8.7 والعديد من روبي 1.9 / 2.0 الأساليب. وهذا يجعل من الاسهل بكثير أن يكون الرمز الذي يعمل على كل هذه المنصات.

واحتمال واحد هو:

(hash.respond_to?(:key) ? hash.key(t) : hash.index(t))

ولكن هذا الإجمالي، ويضيف في سماء المنطقة.

وانها قبيحة بدلا من ذلك، ولكنه يعمل أيضا:

h = { :a => 1 }
[:key,:index].find{|method| break h.send(method, 1) if h.respond_to?(method) }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top