Matlab `openvar` يقبل تبديل - أحيانًا (؟!؟)

1

لماذا ماتلاب openvar رفض أحيانا استخدام تبديل؟

x = { 'alpha' 'bravo'}
a.x = { 'alpha' 'bravo'}

openvar('x''')
% Error:
% The first argument to VariableEditor must be a valid variable name.

openvar('a.x''')
% Works

openvar('x.''')
% Works

أستخدم R2015b.

1 إجابة

1
افضل جواب

الأسباب التكتيكية لقبول openvar('x.''') ورفض openvar('x''') يمكن رؤيته باستخدام dbstop if error . إصدار openvar('x''') ثم يظهر أن الخطأ يرجع إلى الفصل VariableEditor طريقة ، checkVariableName . يتحقق openvar وسيطة السلسلة بالنظر إلى يسار أي نقطة أو قوس / قوس. للحجة x.' ، هذا هو x - تقبل الشفرة هذا كاسم متغير جيد. في حالة عدم وجود نقطة أو قوس ، فإنه يفحص التعبير بأكمله ، وهو x' ، والذي لا يتعرف عليه الرمز كاسم متغير جيد.

في حين أن هذا يوضح كيف أن الكود يؤدي إلى السلوك الموصوف في المنشور الأصلي ، فإن المنطق العالي المستوى ليس واضحًا - خاصة إذا openvar يمكن تقييم وعرض التبديل ، كما يظهر المنشور الأصلي. ربما يقتصر TMW على الحجة على أسماء المتغيرات فقط لأنه سيكون معقدًا جدًا لدعم جميع التعبيرات. وربما لم يكلفوا أنفسهم عناء فخ جميع تعبيرات الأسماء غير المتغيرة المحتملة. وأشار كريس لونغو إلى ذلك openvar('cos(pi)') يجتاز الاختبار ، ولكن تفتح نافذة محرر المتغير وتقول "كوس المتغير (pi) غير موجود."

على أي حال ، فإن معرفة كيفية نقل البيانات للعرض مفيد جدًا نظرًا لوجود العديد من الحالات حيث (1) أريد / لدي متجه صف ، لكن (2) أريد عرضها كعمود.

يبدو أن سبب البند (ط) تاريخي وعملي. إصدار clear x; x(3)=7 افتراضيًا على مصفوفة صف ، أي الانتشار على طول البعد الثاني بدلاً من البعد الأول (لأسفل). هذا أمر عملي لأنه يسمح لنافذة الأمر بإظهار الكثير من المعلومات دون التمرير أكثر من اللازم ، وبالتالي الحفاظ على الكثير من المعلومات السابقة للعرض (هذا يعود إلى الأوقات قبل محرر المتغيرات). علاوة على ذلك ، يجب أن تكون المتجهات أفقية حتى يتم تكرار العناصر في المصطلح for myIterator = VectorOfItems ، مما يجعلها الاتجاه "اذهب إلى".

سبب البند (2) عملي مرة أخرى. إن نشر شيء ما أفقيًا في Variable Editor يجعل من الصعب رؤيته ، حيث أن التباعد الأفقي الافتراضي عريض جدًا. لا ترى الكثير من أجل العرض المتاح ، ومن الصعب إدراكًا مجموعة من البيانات عندما تكون متباعدة بشكل مفرط مثل هذا. يعد عرض هذه البيانات كمتجهات عمود أكثر منطقية ، ولا تنطبق الاعتبارات التاريخية وراء العنصر (1) ، لأنها ليست في سياق إطار أوامر التمرير. بالإضافة إلى ذلك ، في Variable Editor ، يمكننا تجانب النوافذ أفقيًا لاستدعاءات مختلفة لـ openvar ، لذا فإن عرض بيانات العمود لا يضيع مساحة كما يحدث في نافذة أوامر التمرير.

جانبا: هذا التمرين في openvar كشف كود الشذوذ في تحديد وظائف ل dbstop . على سبيل المثال ، إذا حددت المسار الكامل لـ checkVariableName من رسالة الخطأ ، لم يتم تعيين نقطة توقف. عليك أن تصدر dbstop if error ثم قدم حجة غير مقبولة ل openvar من أجل التسبب في خطأ يفتح checkVariableName كود في المحرر. عندها فقط يمكنك تعيين نقطة توقف في checkVariableName باستخدام محرر واجهة المستخدم الرسومية ، أو رفع مستوى واحد في المكدس وتعيين نقطة توقف حيث checkVariableName تم استدعاء.

:مؤلف
فوق
قائمة طعام