Ben Ruby satır içi hata işleyicileriİstisnalar: parantez ekleme neden bir şey değiştirir?
Durum 1
Bu beklendiği gibi çalışan bir yaygın kullanım şeklidir
def foo
raise Error
end
bar = foo rescue 1
# => 1
bar
# => 1
olduğunu nasıl değerlendireceğini anlamak istediğim birkaç şey vardır. foo rescue 1
ifadesi 1
değerini döndürür ve doğru olarak bar
'a atanır.
Durum 2
Yakut descructuring diziler olanak tanıdığından, bu davranış tuhaf görünüyor.
baz = 'a'
baz, bar = foo rescue [1, 2]
# => [1, 2]
baz
# => 'a'
bar
# => nil
ekspresyon dizisi [1, 2]
verir, ancak yapısızlaştırabileceğimizi veya atamak etmez. Tamamen atamayı tamamen atlar. 3
olarak parantez içinde hata sarın
Vaka Ancak yapısöküm çalışır.
baz, bar = (foo rescue [1, 2])
# => [1, 2]
baz
# => 1
bar
# => 2
Vaka 4
Bonus puan: Hata Raising ve satır içi ele çalışırken de atama
baz = raise Error rescue 1
# => 1
baz
# => nil
atlar Ama parantez ekleyerek işe yapar.
Düzenleme:
Ben 2.0.0Düzenleme 2 Yakut 1.9.3-p392 ve Ruby bu test:
Ben durumlarda etiket eklendi
Düzenleme 3:
Görünüşe göre bazı insanlar bunu bir soru değil, belki de başlık yeterince açık değildi. İşte tam metinde soru:
Neden bu tutarsızlıklar oluyor ve neden parantez ekleniyor bir şey değiştiriyor?
"Rescue" satırında çok dikkatli olun. Bir sözdizimi hatası veya IO istisnasıyla karşılaşıncaya kadar çok yararlı görünür ve bu 'kurtarma' gizler. Ayağını hedef alan yüklü ve eğimli bir silahtır. –
Daha önce benzer bir sorun [http://www.ruby-forum.com/topic/152260] [tek satırlı kurtarma ve atama önceliği] var. Ama 'Yukihiro Matsumoto' bir sorun olarak kabul edildi ve şimdi düzeltildi.Onu bir hata bileti olarak yükseltebilirsiniz. –
Hata, https://bugs.ruby-lang.org/issues/8239 –