كيفية اختبار ما إذا كان الكائن روبي غير قابل للتغيير؟

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

  •  19-08-2019
  •  | 
  •  

سؤال

هل هناك طريقة سهلة لاختبار ما إذا كان الكائن هو غير قابل للتغيير (أرقام، لا شيء) أو لا (صفيف، تجزئة، والأشياء)؟ وبعبارة أخرى، يمكن تغييرها من قبل آثار جانبية من رمز آخر؟

والدافع: أريد أن إنشاء مخزن قيمة إصداراتها، ولكن بعض البيانات غير المصفوفات. وبعض من صفائف تخزين كائنات مخصصة، وأنا لا يمكن عكس العلاقة عن طريق تخزين 'في' الملكية والبحث عنه. ولكن أود أيضا أن تكون قادرة على صفائف مخزن للحرف، والمصفوفات الأخرى، وما إلى ذلك.

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

المحلول

وهناك أية كائنات بدائية في روبي. بالتالي لا يمكن الكشف عن هذا بطريقة مباشرة.

لا يمكن أن مجرد استخدام المشير أو YAML لمتجرك إصداراتها؟ ثم ستحصل على التحميل وتوفير جميع أنواع الكائنات مجانا. لماذا إعادة اختراع العجلة؟

وأنا لا أعرف ما الذي تريد تحقيقه بالضبط، ولكن بالنظر إلى مصدر YAML قد يكون من المثير للاهتمام معرفة كيفية التعامل مع هذه المشكلة. تنفيذ ترميز روبي YAML ببساطة تطبق طريقة to_yaml لجميع الفئات ذات الصلة. انظر YAML / rubytypes.rb .

نصائح أخرى

ولقد وجدت وسيلة غير فعالة:

class Object
  def primitive?
    begin
      self.dup
      false
    rescue TypeError
      true
    end
  end
end

وفكرة التحولية لا تنطبق حقا في روبي بنفس الطريقة كما في لغات أخرى. الكائن غير قابل للتغيير الوحيد هو واحد المجمدة. يمكنك إضافة حتى الأساليب والمتغيرات سبيل المثال إلى Fixnums. على سبيل المثال:

class Fixnum
  attr_accessor :name
end
1.name = "one"
2.name = "two"

ومن الواضح أن الغالبية العظمى من الوقت، والناس لن تكون مرضية بما فيه الكفاية لإضافة سمات إلى Fixnum، ولكن النقطة هي، لا يوجد كائن رفع التجميد غير قابل للتغيير حقا.

إذا كنت تستطيع الخروج مع قائمة cannonical من الفئات التي تريد أن نفترض هي غير قابل للتغيير، هل يمكن أن تذهب من خلال ونقدم لهم كل وسيلة immutable?() وترجع صحيح (وجوه نسخة ترجع كاذبة). ولكن مثل wvanbergen قال، فإن أفضل طريقة للتأكد من نسختك من كائن لا يغير هو عميق نسخه مع المشير.

وثمة فرق آخر: أصلا الأشياء ثابتة لا يمكن تجميدها، لكنها لا تزال تعود كاذبة من المجمدة

5.freeze.frozen? == false

وتجميد لا تثير استثناء (على عكس الحزب الاتحادي الديمقراطي) ومع ذلك فإنه (بشكل دائم!) تعديل كائنات قابلة للتغيير.

ولقد وجدت أن أستطيع أن (على الأقل في انها الحالة الراهنة) ترتيب بلدي التطبيق للعمل مع كائنات المجمدة، وسوف روبي تعطيني استثناء إذا حاولت تعديلها مباشرة. ولكن على تجميد يؤثر فقط على المستوى الأول من الكائن و المصفوفات، الخ المخزنة في ذلك لا يزال من الممكن تعديلها.

وهذا لا ينطبق إلا على 1.8 - 5.frozen؟ يعود صحيحا في ruby1.9 (ولكن ليس في irb1.9)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top