متى يتم استخدام "يتطلب" أو "تحميل" أو "تحميل تلقائي" في روبي؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

أنا أفهم الاختلافات الدقيقة بين require, load و autoload في روبي، ولكن سؤالي هو، كيف تعرف أي واحد يجب استخدامه؟

بخلاف القدرة على "التفاف" أ load في وحدة مجهولة، require يبدو أنه المفضل.

ولكن بعد ذلك autoload يسمح لك بتحميل الملفات ببطء - وهو أمر يبدو رائعًا ولكني لست متأكدًا عمليًا مما ستكتسبه require

هل يفضل أسلوب واحد على الآخر؟هل هناك موقف تبرز فيه طريقة واحدة؟

هل كانت مفيدة؟

المحلول

وعموما، يجب عليك استخدام require. load سيتم إعادة تحميل رمز في كل مرة، لذلك إذا كنت تفعل ذلك من عدة وحدات، سوف تقوم به الكثير من العمل الإضافي. وlazyness من autoload يبدو لطيفا من الناحية النظرية، ولكن العديد من وحدات روبي تفعل أشياء مثل الطبقات الأخرى الترقيع قرد، وهو ما يعني أن سلوك أجزاء لا علاقة لها من البرنامج قد يتوقف على ما إذا كان قد تم استخدام فئة معينة بعد أم لا. autoload هو في طور إهمال ، لذلك يجب تجنب استخدامها.

إذا كنت تريد أن تجعل إعادة محمل الخاصة بك التلقائي الذي يقوم بتحميل الشفرة في كل مرة يتغير أو في كل مرة شخص يضرب URL (لأغراض التنمية حتى لم يكن لديك لإعادة تشغيل الخادم الخاص بك في كل مرة)، ثم استخدام load لذلك هو معقول.

نصائح أخرى

mylibrary.rb

puts "I was loaded!"

class MyLibrary
end

حاول في إيرب

irb(main):001:0> require 'mylibrary'
I was loaded!
=> true

irb(main):001:0> autoload :MyLibrary, 'mylibrary'
=> nil
irb(main):002:0> MyLibrary.new
I was loaded!
=> #<MyLibrary:0x0b1jef>

انظر الفرق.

وهنا هو ما تكسب مع autoload على require:

وautoload هو في المقام الأول لتسريع مرحلة التهيئة من برنامج روبي الخاص بك أو تطبيق القضبان. من خلال عدم تحميل الموارد حتى تكون هناك حاجة إليها، فإنه يمكن تسريع الامور قليلا جدا.

وهناك ميزة أخرى هي أنك قد لا تحتاج إلى تحميل بعض أجزاء من شفرة، إذا كان المستخدم لا يستخدم خصائص معينة - وبالتالي تحسين وقت التحميل والحد من أثر الذاكرة

وبصرف النظر عن الآخرين ما سبق أن قال لك، مستقبل autoload غير مؤكد. وكان من المقرر أن يتم إهمال في روبي 2.0، ولكن لم تصدر انتقاص في الوقت المناسب لتجميد ميزة 2.0. ومن المتوقع الآن أن autoload سيتم إهمال في روبي 2.1 ولكن هذا ليس حتى بعض بعد الآن .

scroll top