الكلمة الرئيسية للحصرية أو في روبي؟
سؤال
هل لدى روبي كلمة رئيسية عادية باللغة الإنجليزية للحصرية أو، كما لو أن لديهم "و" أو "؟ إذا لم يكن الأمر كذلك، فهل هذا بسبب الحصري أو لا يسمح بتقييم تقييم التقييم؟
المحلول
أولا، لا أعتقد أنه يمكن أن ينطبق ShortCircuiting بشكل معقول على XOR: مهما كانت قيمة المعامل الأول، يجب فحص الثانية.
ثانيا،، &&، أو & || استخدم ShortCircuiting في جميع الحالات؛ الفرق الوحيد بين إصدارات "الكلمة" و "الرمز" هي الأسبقية. أعتقد أن and
و or
حاضرون لتوفير نفس الوظيفة لأن بيرل لديها في خطوط مثل
process_without_error or die
أعتقد أن السبب لعدم وجود xor
ربما تكون الوظيفة المسماة أنه لا توجد نقطة في مشغل ذات الأسبقية المنخفضة في هذه الحالة وأنه بالفعل وضع مربكي بما فيه الكفاية!
نصائح أخرى
لا، لا يمكنك استخدامها فقط ^
.
لا أعرف لماذا لا يوجد هناك بشكل خاص لأنها ليست كذلك استخدامها بشكل شائع.
ركضت في مشكلة لأن المشغل "^" يعمل على الأرقام
true ^ 1
=> false
1 ^ true
TypeError: can't convert true into Integer
true ^ 1
لذلك كان الحل البديل:
( !!a ^ !!b )
حيث تنفجر ضجة كبيرة في المنطمنون.
!!1 ^ !!true
=> false
!!1 ^ !!false
=> true
يحاول ^
true ^ false #=> true
true ^ true #=> false
false ^ false #=> false
لا يوجد مشغل مكافئ باللغة الإنجليزية عادي.
كبديل عن خدعة نفي مات فان قرن مزدوجة لاستخدام XOR على أنواع تعسفية، يمكنك سلسلة اختبار XOR آخر، بدءا من nil
. وبعد بمعنى آخر:
!!foo ^ !!bar
أي ما يعادل
nil ^ foo ^ bar
يبدو هذا النمر على عيني، وأفترض أنه يتطلب عملية واحدة منطقية
يظهر إجابة جون غير صحيحة. في IRB مع 1.9.3، XOR ("كب كيك"، كاذبة) يعود صحيحا، كما تتوقع.
1.9.3-p429 :104 > def xor(a,b)
1.9.3-p429 :105?> (a and (not b)) or ((not a) and b)
1.9.3-p429 :106?> end
=> nil
1.9.3-p429 :107 > xor(false, true)
=> true
1.9.3-p429 :108 > xor("cupcake", false)
=> true
أي تنفيذ xor
لن تسمح في الدائرة القصيرة. يجب تقييم كلا عبر التعبيرات بغض النظر عن ما.
روبي يقدم ^
المشغل، ولكن هذا سوف يخنق قيم الصبح. لقد قمت بتنفيذ وظيفة للتعامل مع الحالات التي أريد xor
هذا يتصرف أكثر مثل and
و or
:
def xor(a,b)
(a and (not b)) or ((not a) and b)
end
على عكس ^
, ، يمكن استخدام هذه الوظيفة في المواقف المشابهة لما يلي:
xor("hello".match(/llo/), false) # => true
xor(nil, 1239) # => true
xor("cupcake", false) # => false