الأسبقية للمشغل و / && في Ruby [مكررة
-
12-09-2019 - |
سؤال
هذا السؤال لديه بالفعل إجابة هنا:
- الفرق بين "و" و && في روبي؟ 7 إجابات
لدي سؤال فيما يتعلق ب / && / = الكلمات الرئيسية في Ruby.
يقول مستندات Ruby أن الأسبقية للكلمات الرئيسية المذكورة هي: (1) &&، (2) =، (3) و.
لدي هذا القصاص من التعليمات البرمجية كتبت:
def f(n)
n
end
if a = f(2) and b = f(4) then
puts "1) #{a} #{b}"
end
if a = f(2) && b = f(4) then
puts "2) #{a} #{b}"
end
الإخراج هو:
1) 2 4 [من المتوقع
2) 4 4 [لماذا?]
لسبب ما باستخدام && يسبب كل من A و B للتقييم إلى 4؟
المحلول
أنا لا أفهم تماما السؤال الذي تسأله. يعني، لديك سابقا بالنظر إلى الإجابة بنفسك، قبل حتى طرح السؤال: &&
يرتبط أكثر إظهار من =
في حين and
يرتبط أقل بإحكام من =
.
لذلك، في الحالة الأولى، يتم تقييم التعبير على النحو التالي:
( a=f(2) ) and ( b=f(4) )
( a= 2 ) and ( b=f(4) )
2 and ( b=f(4) ) # a=2
2 and ( b= 4 ) # a=2
2 and 4 # a=2; b=4
4 # a=2; b=4
في الحالة الثانية، يكون التقييم كما يلي:
a = ( f(2) && ( b=f(4) ) )
a = ( 2 && ( b=f(4) ) )
a = ( 2 && ( b= 4 ) )
a = ( 2 && 4 ) # b=4
a = 4 # b=4
4 # b=4; a=4
نصائح أخرى
السبب بسيط: الأسبقية. كما تقول، النظام هو:
- &&
- =
- و
حيث &&
لها الأسبقية =
, ، يتم تقييم البيان مثل هذا:
if a = (f(2) && (b = f(4))) then
مما يؤدي إلى:
if a = (2 && 4) then
متي x
و y
هي أعداد صحيحة، x && y
عائدات y
. وبعد هكذا 2 && 4
النتائج في a = 4
.
من أجل المقارنة، يتم تقييم أول واحد مثل هذا:
if (a = f(2)) and (b = f(4)) then
من برمجة روبي 1.9.:
الفرق الوحيد في النموذجين هو الأسبقية (
and
يرتبط أقل من&&
).
لا أعرف القواعد المحددة التي يمكن أن تساعد في هذه الحالة، ولكن دعونا نستخدم أولويات العمليات. باستخدام قواعد الأولويات، يمكننا تقسيم حساب التعبير الثاني على عدة خطوات
1 f(2) && b => expr1
2 expr1 = f(4) => expr2
3 a = expr2
من الواضح أنه في الخطوة 2 نحصل على موقف غير صحيح - على الجانب الأيسر من = هو RValue - كائن مؤقت، والذي لا يمكن تعيينه بأي قيمة. أفترض أن محلل النحوي يكسر قواعد التقييم ذات الأولوية للتعبيرات عند مواجهة مثل هذه الحالات. يمكن العثور على مزيد من التفاصيل حول حسابات التعبيرات هنا
إذا قمت بتعديل رمزك مثل هذا، فستحصل على ما تتوقعه
def f(n)
n
end
if (a = f(2) and b = f(4)) then
puts "1) #{a} #{b}"
end
if (a = f(2) and b = f(4)) then
puts "2) #{a} #{b}"
end
1) 2 4
2) 2 4