ما هو بناء الجملة ( = > ) المستخدمة في تعيين كائن الخطأ إلى متغير من طريقة 'الإنقاذ'?

StackOverflow https://stackoverflow.com//questions/9686991

سؤال

ال rescue والذي يمكن أن يعين متغيرا للإشارة إلى كائن الخطأ يحتوي على بناء الجملة هذا (=>)

rescue => e

إذا rescue هو واحد من استدعاء الأسلوب العام ، ما هو معنى =>.هل يمكنني استخدام نفس بناء الجملة على استدعاء طريقة أخرى?

my_method arg1, arg2 => my_obj
هل كانت مفيدة؟

المحلول

بينما raise هو في الواقع طريقة, rescue ليس كذلك.إنها كلمة رئيسية ومحددة على تحليل.ص: 10467.على هذا النحو ، فإن بناء الجملة لديك هو خاص ل rescue (منذ => e ليس أي نوع من الطريقة حجة) ، وغير صالحة للطرق نفسها (على الأقل ليس بنفس المعنى).كيف / أين rescue => e يتم تعريف بناء الجملة نفسه في المحلل اللغوي لست متأكدا تماما.

نصائح أخرى

كما قد يقول بعض مدرب كرة القدم/الفيلسوف الملك ، هذا ما هو عليه.هنا روبي تحليل.y.ذات أهمية خاصة هي هذا الجزء:

opt_rescue      : keyword_rescue exc_list exc_var then
                  compstmt
                  opt_rescue
                    ...
                | none
                ;

exc_list        : arg_value
                    ...
                | mrhs
                    ...
                | none
                ;

exc_var         : tASSOC lhs
                    ...
                | none
                ;

الشرح
exc_list لا يسمح بشكل أساسي بأي شيء ، أو نوع استثناء ، أو سلسلة (متناثرة) من الاستثناءات مثل rescue ZeroDivisionError, LoadError

exc_var يمكن أن يكون لا شيء أو => some_variable

opt_rescue لذلك يمكن أن يكون rescue في حد ذاته أو بالإضافة إلى أي أو كل من أعلاه.

انها فقط المدرجة هنا بناء جملة خاص لتعيين الاستثناءات.الاستخدام الآخر الوحيد ل => هو ل جمعية القيمة الرئيسية.

لاحظ أيضا أن arg_value و mrhs على الجانب الأيسر و lhs على الجانب الأيمن ، وهو بقدر ما أستطيع أن أقول المكان الوحيد الذي يحدث فيه هذا.شخص تصحيح لي إذا كنت مخطئا هنا ، ولكن ليس هناك أي مهمة أخرى "إلى الوراء" في تحليل.y.

لا ، يتم استخدام بناء الجملة في الإنقاذ هناك فقط.إذا كنت تستخدم صاروخ هاش '= > ' في استدعاء وظيفة من هذا القبيل ، سيتم تفسيره على أنه تجزئة ، وإذا لم يتم تعريف أرغ 2 كمتغير سابقا ، سيكون خطأ.

def foo(a,b)
  puts b.inspect
end

foo "bar", :baz => 5   #=> {:baz=>5}

foo "bar", baz => 5    #=> NameError: undefined local variable or method `baz'

baz = "flux"

foo "bar", baz => 5   #=> {"flux"=>5}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top