Bir komisyon görevinden nasıl erken dönebilirim?


226

Başlangıçta bazı kontroller yaptığım bir komisyon görevim var, çeklerden biri başarısız olursa komisyon görevinden erken dönmek istiyorum, kalan kodlardan herhangi birini yürütmek istemiyorum.

Çözüm koddan dönmek istedim bir dönüş yerleştirmek olacağını düşündüm ama aşağıdaki hatayı alıyorum

unexpected return

Yanıtlar:


285

Tırmık görevi temelde bir bloktur. Lambdas hariç bir blok dönüşü desteklemez, ancak nextbir komisyon görevinde bir yöntemde dönüş kullanma efektinin aynı etkiye sahip olduğu bir sonraki ifadeye atlayabilirsiniz .

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

Veya kodu bir yöntemde taşıyabilir ve yöntemde return kullanabilirsiniz.

task :foo do
  do_something
end

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

İkinci tercihi tercih ederim.


18
Ben de ikincisini seviyorum. Komisyon ne kadar çok kullanırsam önemsiz olmayan kodu görev tanımının dışında tutmayı o kadar çok isterim. % 100 kesin bir kural değil, ama çalışmak için iyi bir rehber gibi görünüyor.
Mike Woodhouse

6
Ben denedim breakve bu hatayı aldım: komisyon iptal edildi! proc-closure kırmak (--trace ile görev çalıştırarak tam izi görün)
pupeno

4
Sonrakini kullanmayı tercih ederim. Neden sadece erken iadeleri desteklemek için yeni bir yöntem açıklayalım?
Derek Greer

5
Birden fazla blokta derinden yuvalanmışsanız ne yaparsınız? ( nextsadece kırılmak üzere "blok düzeyinde" çalışıyorsa çalışır
mjs

3
Uyarı: Komisyon görevlerinde yöntem bildirmek kötü bir fikirdir çünkü ad alanı ile ilgisi olmayan tüm yüklü Komisyon görevlerinde globaldirler. Sonraki bölüm, break yerine kullanılır çünkü bloktaki kod, bloğu yürüten herhangi bir şey tarafından birden çok kez çağrılabilir (.each yöntemini düşünün).
Leslie Viljoen

181

Bu abort(message)görevi bir mesajla iptal etmek için görevin içinden kullanabilirsiniz .


5
@TylerRick Hayır, Çekirdek # iptal .
Jo Liss

10
Bu şekilde, çıkış durumunu otomatik olarak ayarladığından başarılı olmayan durumlarda çıkmak için üstündür.
samuil

Bu bir kazanan. Ayrıca, argüman hataları için kullanım geri bildirimi sağlamanın kolay bir yolu.
David Hempy

Satır içi ve çok daha açıklayıcı next. Sevdim.
SomeSchmo

22

Bu abortgibi durumlarda daha iyi bir alternatif olan kullanmaya eğilimliyim , örneğin:

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

1
Ama çıkış koduyla abortçıkmadan nasıl gidiyorsunuz 1? Komisyon görevleri, başarı veya başarısızlığı belirlemek için genellikle komut satırında kullanılır. "Başarılı" var abortmı?
Joshua Pinter

2
Kendi sorularıma cevap verdim: Görünüşe göre exitbaşarıyla çıkmanın iyi bir yolu var.
Joshua Pinter

19

Hata ile İade ❌

Kullanmak isteyeceğiniz bir hatayla (yani bir çıkış koduyla ) dönüyorsanız , çıkışta çıkacak isteğe bağlı bir dize parametresi de alır:1abort

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

Komut satırında:

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

Başarıyla İade ✅

Eğer geri döndüyseniz olmadan (yani bir çıkış kodu bir hata 0) Kullanmak istediğiniz edeceğiz exit, hangi gelmez bir dize param alır.

task :check do

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

end

Komut satırında:

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

Bu, bir cron işinde veya daha sonra komisyon görevinin başarılı olup olmadığına bağlı olarak bir şeyler yapması gereken bir şey kullanıyorsanız önemlidir.



8

"Komisyon iptal edildi!" Ye neden olmadan bir komisyon görevinden çıkmak istiyorsan. yazdırılacaksa, "iptal" veya "çıkış" kullanabilirsiniz. Ancak bir kurtarma bloğunda kullanıldığında "iptal" görevi görevi sonlandırır ve tüm hatayı yazdırır (--trace kullanmadan bile). Yani "çıkış" kullandığım şey.


3
Genel olarak, sadece geçerli proc / yöntem / vb atlamak değil çünkü dönüş / mola yerine "çıkış" kullanmak kötü bir fikir olduğunu düşünüyorum . - tüm işlemden çıkar ve arayan yönteminin daha sonra çalıştırılması planlanan herhangi bir kodu atlar (muhtemelen bazı temizleme işlemleri dahil). Ama bir komisyon işi için sanırım bu muhtemelen bir sorun değil ...
Tyler Rick

0

nextSimone Carletti tarafından önerilen yaklaşımı kullandım , çünkü abortaslında sadece bir sarıcı olan komisyon görevini test exitederken istenen davranış değil.

Misal:

task auto_invoice: :environment do
  if Application.feature_disabled?(:auto_invoice)
    $stderr.puts 'Feature is disabled, aborting.'
  next
end
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.