سؤال

هذا السؤال لديه بالفعل إجابة هنا:

لدي سؤال فيما يتعلق ب / && / = الكلمات الرئيسية في 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

نصائح أخرى

السبب بسيط: الأسبقية. كما تقول، النظام هو:

  1. &&
  2. =
  3. و

حيث && لها الأسبقية =, ، يتم تقييم البيان مثل هذا:

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

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