আমি কীভাবে রেক টাস্ক থেকে তাড়াতাড়ি ফিরব?


226

আমার একটি রেক টাস্ক রয়েছে যেখানে আমি শুরুতে কয়েকটি চেক করি, যদি কোনও চেক ব্যর্থ হয় তবে আমি রাক টাস্ক থেকে তাড়াতাড়ি ফিরে আসতে চাই, আমি বাকী কোনও কোড কার্যকর করতে চাই না।

আমি ভেবেছিলাম যে সমাধানটি আমি কোড থেকে ফিরে আসতে চেয়েছি এমন কোনও রিটার্ন স্থাপন করা হবে তবে আমি নিম্নলিখিত ত্রুটিটি পেয়েছি

unexpected return

উত্তর:


285

একটি রেক টাস্ক মূলত একটি ব্লক। লাম্বডাস ব্যতীত একটি ব্লক রিটার্নকে সমর্থন করে না তবে আপনি nextএকটি রেক টাস্কে কোনও পদ্ধতিতে রিটার্ন ব্যবহারের একই প্রভাব ফেলে তা ব্যবহার করে পরবর্তী বিবৃতিতে যেতে পারেন ।

task :foo do
  puts "printed"
  next
  puts "never printed"
end

অথবা আপনি কোনও পদ্ধতিতে কোডটি সরাতে পারেন এবং পদ্ধতিতে রিটার্ন ব্যবহার করতে পারেন।

task :foo do
  do_something
end

def do_something
  puts "startd"
  return
  puts "end"
end

আমি দ্বিতীয় পছন্দ পছন্দ।


18
আমি খুব ভাল দ্বিতীয় পছন্দ। আমি যত বেশি রাক ব্যবহার করি তত বেশি তুচ্ছ কোডকে কার্য সংজ্ঞাের বাইরে রাখতে পছন্দ করি। 100% দৃ rule় নিয়ম নয়, তবে এটি কার্যকর করার জন্য একটি ভাল গাইডলাইন বলে মনে হচ্ছে।
মাইক উডহাউস

6
আমি চেষ্টা করেছি breakএবং আমি এই ত্রুটি পেয়েছি: রেক বাতিল! proc-অবসান থেকে BREAK (--trace সঙ্গে কাজের চলমান পূর্ণ ট্রেস দেখুন)
pupeno

4
আমি পরবর্তী ব্যবহার পছন্দ। শুধু প্রারম্ভিক আয়গুলি সমর্থন করার জন্য কেন আমরা একটি নতুন পদ্ধতি ঘোষণা করব?
ডেরেক গ্রেয়ার

5
আপনি যদি একাধিক ব্লকের মধ্যে গভীরভাবে বাসা বাঁধেন তবে আপনি কী করবেন? ( nextকেবলমাত্র তখনই কাজ সেখান থেকে বিরতি ব্লক "স্তর" এ যদি।
mjs

3
সতর্কতা: র‌্যাক কার্যগুলিতে পদ্ধতি ঘোষণা করা একটি খারাপ ধারণা কারণ এগুলি সমস্ত লোড করা রাক কার্যক্রমে বিশ্বব্যাপী, নাম জায়গার অপ্রাসঙ্গিক। বিরতির পরিবর্তে পরবর্তীটি ব্যবহৃত হয় কারণ ব্লকের কোডটিকে ব্লকটি কার্যকর করা যা কিছু দ্বারা ডাকা হতে পারে (.each পদ্ধতিটি ভাবেন)।
লেস্লি ভিলজোয়েন

181

আপনি abort(message)কোনও বার্তা দিয়ে সেই কাজটি বাতিল করতে টাস্কের ভিতরে থেকে ব্যবহার করতে পারেন ।


5
@ টাইলারিক রিক না, এটি কার্নেল # বিসর্জন ।
জো লিস

10
অ-সাফল্য পরিস্থিতিতে প্রস্থান করার জন্য এই উপায়টি সর্বোত্তম কারণ এটি স্বয়ংক্রিয়ভাবে প্রস্থান স্থিতি সেট করে।
সামুয়েল

এটি একটি বিজয়ী। যুক্তি ত্রুটির জন্য ব্যবহারের প্রতিক্রিয়া সরবরাহ করার একটি সহজ উপায়।
ডেভিড হ্যাম্পি

ইনলাইন এবং এর চেয়ে অনেক বেশি ব্যাখ্যামূলক next। এটা ভাল।
সোমস্ম্মে

22

আমি ব্যবহার করি abortযা এই জাতীয় পরিস্থিতিতে একটি ভাল বিকল্প, উদাহরণস্বরূপ:

task :foo do
  something = false
  abort 'Failed to proceed' unless something
end

1
তবে কীভাবে আপনি abortএকটি 1প্রস্থান কোড সহ প্রস্থান ছাড়বেন না ? সাফল্য বা ব্যর্থতা নির্ধারণ করতে প্রায়শই কমান্ড লাইনে রাক কার্যগুলি ব্যবহার করা হয়। "সফল" আছে কি abort?
জোশুয়া পিন্টার

2
আমার নিজের প্রশ্নের উত্তর: মনে হচ্ছে exitসফলভাবে প্রস্থান করার একটি ভাল উপায়।
জোশুয়া পিন্টার

19

একটি ত্রুটি দিয়ে ফিরে ❌

যদি আপনি কোনও ত্রুটি (অর্থাত্ একটি প্রস্থান কোডের ) নিয়ে ফিরে আসছেন তবে আপনি 1ব্যবহার করতে চান abort, এটি একটি alচ্ছিক স্ট্রিং প্যারাম নেয় যা প্রস্থান করার সময় আউটপুট হবে:

task :check do

  # If any of your checks fail, you can exit early like this.
  abort( "One of the checks has failed!" ) if check_failed?

end

কমান্ড লাইনে:

$ rake check && echo "All good"
#=> One of the checks has failed!

সাফল্য দিয়ে ফিরে ✅

আপনি যদি কোনও ত্রুটি ছাড়াই ফিরে আসছেন (যেমন একটি প্রস্থান কোডের 0) আপনি ব্যবহার করতে চান exit, যা স্ট্রিং প্যারাম নেয় না

task :check do

  # If any of your checks fail, you can exit early like this.
  exit if check_failed?

end

কমান্ড লাইনে:

$ rake check && echo "All good"
#=> All good

আপনি যদি ক্রোন চাকরীতে বা এমন কিছু ব্যবহার করেন যা পরে রেক টাস্ক সফল হয়েছিল কিনা তার ভিত্তিতে কিছু করার দরকার পরে এটি গুরুত্বপূর্ণ।


11

আপনার যদি একাধিক ব্লকের স্তর ভেঙে ফেলার প্রয়োজন হয় তবে আপনি ব্যর্থতা ব্যবহার করতে পারেন ।

উদাহরণ স্বরূপ

task :something do
  [1,2,3].each do |i|
    ...
    fail "some error" if ...
  end
end

( Https://stackoverflow.com/a/3753955/11543 দেখুন ))


8

যদি আপনি "রেকটি বাতিল!" বার্তাটি মুদ্রিত হতে হবে, তারপরে আপনি "পরিত্যাগ" বা "প্রস্থান" ব্যবহার করতে পারেন। "রেসকিউ", যখন রেসকিউ ব্লকে ব্যবহৃত হয়, কাজটি সমাপ্ত করার পাশাপাশি পুরো ত্রুটিটি প্রিন্ট করে (এমনকি --trace ব্যবহার না করে)। সুতরাং "প্রস্থান" হ'ল আমি ব্যবহার করি।


3
সাধারণভাবে, আমি মনে করি প্রত্যাবর্তন / বিরতির পরিবর্তে "প্রস্থান" ব্যবহার করা একটি খারাপ ধারণা কারণ এটি কেবলমাত্র বর্তমান প্রকল্প / পদ্ধতি / ইত্যাদির বাইরে চলে যায় না। - এটি সম্পূর্ণ প্রক্রিয়াটি থেকে বেরিয়ে আসে এবং কলার পদ্ধতিটি পরে চালানো যেতে পারে এমন কোনও কোড এড়িয়ে যায় (সম্ভবত কিছু পরিষ্কারও সহ)। তবে একটি রেক টাস্কের জন্য আমি অনুমান করি এটি সম্ভবত কোনও সমস্যা নয় ...
টাইলার রিক

0

আমি nextসিমোন কার্লেটিয়ের প্রস্তাবিত পদ্ধতির ব্যবহার করেছি , যেহেতু রেক টাস্কের পরীক্ষার সময় abort, যা বাস্তবে কেবল একটি মোড়ক exit, এটি পছন্দসই আচরণ নয়।

উদাহরণ:

task auto_invoice: :environment do
  if Application.feature_disabled?(:auto_invoice)
    $stderr.puts 'Feature is disabled, aborting.'
  next
end
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.