سؤال

أنا جديد على Ruby وخرضر مؤخرا مشكلة مقارنة بالقيم عند إنشاء روبي على تطبيق القضبان. في وحدة تحكم، كان لدي العبارة التالية التي عادت دائما خطأ:

if (user.id != params[:id])

كانت المشكلة هو المستخدم .ID (وهو رقم قياسي نشط) هو عدد صحيح والمعايير [: ID] هو سلسلة. أخذني بعض الوقت لمعرفة ذلك وأخيرا غيرت ذلك إلى:

if (user.id != params[:id].to_i)

الآن يعمل البيان كما هو متوقع.

لتجنب هذا الخطأ في المستقبل هل هناك طريقة إلى "ترجمة" أو احصل على روبي لتحذيرك إذا حاولت مقارنة أنواع 2 مختلفة؟ بعض القضايا الأخرى التي رضعت في ذلك أود أن "تجميع الشيكات" هي:

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

أنا أستخدم حاليا Ruby 1.8.6-27 RC2 مع القضبان 2.3.2 والرأش IDE على Windows.

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

المحلول 6

أفضل الحلول التي وجدتها هي ide التي تم فحص بناء الجملة على السحب، مثل Rubymine. لست متأكدا مما إذا كان قد حل مشكلتي الأصلية، لكنني ساعدني في العثور على وإصلاح العديد من أخطاء بناء الجملة وإصلاحها. أشكركم جميعا على إقتراحاتكم.

نصائح أخرى

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

تحرير: يجب أن أشير إلى أن القدرة على مقارنة نوعين، لا تعتمد على أسماء الأسلوب حتى آخر الثانية، وما إلى ذلك هي الميزات الأساسية ل Ruby.

لا تتصل بطريقة ما بقدر إرسال رسالة إلى كائن. الهدف هو المسؤول عن معرفة كيفية التعامل مع الطريقة. في القضبان، يستخدم هذا للوصول إلى أعمدة DB في Activerecord. لا توجد طرق للأعمدة حتى يتم إرسال رسالة مع اسم العمود إلى الكائن.

الكتابة الثابتة في روبي يتعارض مع نظام الطباعة البط. يمكن للمرء في كثير من الأحيان الحصول على تعدد الأشكال مجانا دون القلق بشأن مخططات الميراث / الواجهة المعقدة.

أقترح احتضان هذه الميزات وتعويض عدم اليقين من خلال الاختبار

لا يسمح لك Ruby بإعادة تعريف المشغل == للكائن. في Ruby 1.8 لا يمكنك ذلك، كان من المفترض أن يفعل روبي 1.9 لكنني لم أتمكن من الحصول على البرنامج النصي الخاص بي للعمل في الفصول الأساسية. إنه يعمل بشكل جيد لكائنات محددة مخصصة.

class Object

  alias :equal_without_warning :==

  def ==(object)
    unless self.class == object.class
      warn("Comparing `#{self.class}' with `#{object.class}'")
    end
    equal_without_warning(object)
  end

end

على افتراض أنني لم أقم ببعض خطأ الترميز الغبي، فإن الإجابة لا: لا يمكنك التحقق مما إذا كنت تقارن نوع مختلف من الكائنات.

أيضا، أود أن أقول أنك لا تفعل ذلك. في الواقع روبي لم يتم تصميمه للعمل بهذه الطريقة، وهذا هو أكثر طريقة Java بدلا من أسلوب الروبي.

روبي ليس من المفترض أن تكون آمنة. يتيح لك مقارنة أي كائنين، وهذا هو المكان الذي يأتي فيه الكثير من سلطته. لن تكون القضبان ممكنة بدون مثل هذا التصميم الديناميكي.

حتى اللغة المترجمة مثل Java أو C لن تمنعك من القيام == على كائنين. كما قال بن، من الأفضل اختبار أولا. فحص الهياكل التي تعمل معها. طريقة واحدة للحصول على معلومات حول كائن Ruby هو استخدام:

puts object.class

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

شيئين أقترحه:

واحد: اقرأ على IRB (أو البرنامج النصي / وحدة التحكم للقضبان). تتمثل ممارسة التنمية المشتركة في اللغات الحيوية في تجربة مقتطفات من التعليمات البرمجية داخل مترجم "مباشر" (مثل IRB أو وحدة الكربان). تعود هذه الممارسة إلى أقرب لغات ديناميكية مثل Smalltalk و Lisp. يعد تصحيح Ruby-Debug مفيد بالفعل لاستكشاف مشكلات استكشاف الأخطاء وإصلاحها وسوف تكون وسيلة سهلة حقا لمعرفة الخطأ في مثالك.

اثنان: اقرأ على "طب الكتابة". "الأنواع" والمتغيرات تعمل بشكل مختلف قليلا في روبي من كثير من الناس تتوقعهم. كما أفهمها، متغير مثل User.id ليس لديه "نوع". القيمة وأشار إلى بواسطة user.id هل لديك نوع، ولكن المتغير نفسه لا. أعتقد أن هذا جزء من السبب في عدم وجود أداة من شأنها أن تخبرك ما كان الخطأ الخاص بك مسبقا تشغيل البرنامج. مقارنة هؤلاء المتغيرين ليس خطأ لأن المتغيرات لا تحتوي على نوع. كان المستخدم. هل كان يشير إلى عدد صحيح في تلك المرحلة في البرنامج الخاص بك، ولكن سيكون من القانوني تماما تعيين المستخدم. من المفترض أن تشير إلى سلسلة، عند هذه النقطة التي ستكون من شأنها أن تكون هناك معنى أكبر بكثير. :-)

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