سؤال

يقوم 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.

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