كيفية اختبار ما إذا كان الكائن روبي غير قابل للتغيير؟
-
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)