سؤال

هل لدى روبي كلمة رئيسية عادية باللغة الإنجليزية للحصرية أو، كما لو أن لديهم "و" أو "؟ إذا لم يكن الأمر كذلك، فهل هذا بسبب الحصري أو لا يسمح بتقييم تقييم التقييم؟

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

المحلول

أولا، لا أعتقد أنه يمكن أن ينطبق 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top