سؤال
يقوم def الآن بإرجاع اسم الطريقة.حتى تتمكن من الكتابة
private def foo
p "foo is private"
end
لكن كان لدي خطأ في الطريقة الأكثر صعوبة:
2.1.1p2 :036 > private def refresh_prices
2.1.1p2 :037?> orders = order_items.includes(:book)
2.1.1p2 :038?> sum = 0
2.1.1p2 :039?> orders.each do |t|
2.1.1p2 :040 > t.price = t.book.price
2.1.1p2 :041?> sum += t.price * t.quantity
2.1.1p2 :042?> t.save
2.1.1p2 :043?> end
2.1.1p2 :044?> self.total_price = sum
2.1.1p2 :045?> save
2.1.1p2 :046?> end
SyntaxError: (irb):39: syntax error, unexpected keyword_do_block, expecting keyword_end
orders.each do |t|
^
بدون القطاع الخاص، يعود هذا def :refresh_prices.هل يمكن لأي شخص أن يشرح سبب فشله وهل هي طريقة سيئة لاستخدام التعريف الخاص؟
المحلول
هذا ممتع.يبدو أن كتلة do/end تسبب خطأً في بناء الجملة.
إذا كنت تستخدم {}
-style block، فهو يعمل كما هو متوقع.
private def refresh_prices
orders = order_items.includes(:book)
sum = 0
orders.each { |t|
t.price = t.book.price
sum += t.price * t.quantity
t.save
}
self.total_price = sum
save
end
# => Object
أعتقد أنه يمكن اعتباره خطأ.سأرى ما إذا كان هناك أي تقرير عن أداة تعقب الأخطاء في روبي.
يحرر: أؤكد أنه خطأ في Ruby 2.1 (انظر الخطأ رقم 9308).لقد تم إصلاح هذه المشكلة في إصدار Ruby الحالي، وبالتالي سيكون متاحًا في إصدار تصحيح الأخطاء التالي.
في الوقت الحالي، ما عليك سوى استخدام {}
نمط الكتلة بدلاً من do/end.
لا تنتمي إلى StackOverflow