سؤال

وأنا فقط أريد أن أعرف أفضل طريقة لمحاكاة تعداد C # أسلوب في روبي.

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

المحلول

<اقتباس فقرة>   

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

إذا كنت في حاجة إلى التعدادات لتعيين القيم (على سبيل المثال، تحتاج إلى الحد الأدنى ليساوي 0، إلى أقصى حد إلى ما يعادل 100، الخ) فما استقاموا لكم فاستقيموا استخدام تجزئة من الرموز لالقيم، مثل هذا:

WINDOW_STATES = { :minimized => 0, :maximized => 100 }.freeze

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

WINDOW_STATES.keys.include?(window_state)

وبدلا من ذلك، إذا كنت لا تحتاج إلى أي قيم، وتحتاج فقط للتحقق "عضوية" ثم مجموعة على ما يرام

WINDOW_STATES = [:minimized, :maximized].freeze

استخدم مثل هذا

WINDOW_STATES.include?(window_state)

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

WINDOW_STATES = %w(minimized maximized open closed).freeze

وهذا هو الى حد كبير ما القضبان validates_inclusion_of المصادقة والغرض بنيت ل: -)

الشخصية ملاحظة:

وأنا لا أحب كتابة تشمل؟ في كل وقت، لذلك لدي هذا (الأمر معقد فقط بسبب. في (1، 2، 3) حالة:؟

class Object

    # Lets us write array.include?(x) the other way round
    # Also accepts multiple args, so we can do 2.in?( 1,2,3 ) without bothering with arrays
    def in?( *args )
        # if we have 1 arg, and it is a collection, act as if it were passed as a single value, UNLESS we are an array ourselves.
        # The mismatch between checking for respond_to on the args vs checking for self.kind_of?Array is deliberate, otherwise
        # arrays of strings break and ranges don't work right
        args.length == 1 && args.first.respond_to?(:include?) && !self.kind_of?(Array) ?
            args.first.include?( self ) :
            args.include?( self )
        end
    end
end

وهذا يتيح لك اكتب

window_state.in? WINDOW_STATES

نصائح أخرى

وانها ليست تماما نفس، ولكن كثيرا ما كنت سوف بناء تجزئة لهذا النوع من الشيء:

STATES = {:open => 1, :closed => 2, :max => 3, :min => 4}.freeze()

وتجميد تجزئة يبقى لي من تعديل قصد محتوياته.

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

STATES = Hash.new { |hash, key| raise NameError, "#{key} is not allowed" }
STATES.merge!({:open => 1, :closed => 2, :max => 3, :min => 4}).freeze()

STATES[:other] # raises NameError

وأنا لا أعتقد أن روبي يدعم تتضمن التعدادات الحقيقية - على الرغم من أنه لا تزال هناك الحلول المتاحة

.

التعدادات وروبي

وأسهل طريقة لتعريف التعداد في الياقوت لاستخدام فئة مع المتغيرات المستمرة.

class WindowState
  Open = 1
  Closed = 2
  Max = 3
  Min = 4
end

وجعل فئة أو التجزئة كما قال آخرون ستعمل. ومع ذلك، فإن الشيء روبي القيام به هو استخدام <لأ href = "http://www.rubytips.org/2008/01/26/what-is-a-ruby-symbol-symbols-explained/" يختلط = "نوفولو noreferrer "> رموز . الرموز في روبي تبدأ مع القولون وتبدو مثل هذا:

greetingtype = :hello

وهم نوع من مثل الكائنات التي تتكون فقط من اسم.

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