"!" Nin amacı nedir? ve "?" yöntem isimlerinin sonunda?


Yanıtlar:


160

Okunabilirlik için "sadece şeker kaplama", ancak ortak anlamları var:

  • Biten yöntemler, !bazı kalıcı veya potansiyel olarak tehlikeli değişiklikler gerçekleştirir ; Örneğin:
    • Enumerable#sortEnumerable#sort!yerinde sıralarken nesnenin sıralanmış bir sürümünü döndürür .
    • Rails'de, bir istisna oluştururken ActiveRecord::Base#savekaydetme başarısız olursa false döndürür ActiveRecord::Base#save!.
    • Kernel::exitbir komut dosyasının çıkmasına neden olurken Kernel::exit!, bunu hemen yapar, herhangi bir çıkış işleyicisini atlar.
  • Sonuçta biten yöntemler? , kodun bir cümle gibi daha sezgisel olarak akmasını sağlayan bir boolean ile biter - if number.zero?"sayı sıfırsa" gibi okunur, ancak if number.zerotuhaf görünür.

Örnekte, name.reverseBir ters dizeye değerlendirir, ancak sonrasında name.reverse!hat yapar namedeğişken aslında ihtiva ters isim. name.is_binary_data?" nameikili veri mi?" gibi görünüyor .


22
Önemli bir not, aynı zamanda karşılık gelen patlamayan bir yönteminiz varsa, yalnızca bir patlama yöntemine sahip olmanız gerektiğidir. Patlama, yöntemin "daha şaşırtıcı" versiyonunu "daha az şaşırtıcı" olandan ayırt etmek için kullanılır. Tek bir yönteminiz varsa, o zaman ayrım yapmaya gerek yoktur ve onu bir patlama ile adlandırmamalısınız. Array#clearÖrneğin bkz . Diziyi temizler. Diziyi temizlemek doğal olarak onu değiştirir. Bunda şaşırtıcı bir şey yok, isim zaten bunu açıkça gösteriyor, bu nedenle: patlama yok. Ruby-forum.com/topic/176830#773946 adresine bakın .
Jörg W Mittag

2
Ruby Stil Kılavuzuna göre @ JörgWMittag'in belirttiği şeye eklemek : Potansiyel olarak tehlikeli yöntemlerin adları (yani kendini veya argümanları değiştiren yöntemler, exit! (Sonlandırıcıları çıkış yaptığı gibi çalıştırmaz), vb.) Bu tehlikeli yöntemin güvenli bir versiyonu varsa bir ünlem işareti .
Tod Birdsall

2
Dikkat edin, bu her zaman böyle değildir. Örneğin, Ruby Array # concat docs.ruby-lang.org/en/2.0.0/Array.html#method-i-concat . Kötü bir şekilde yanabileceğiniz yer MyActiveRecordModel.column_names.concat (...) gibi bir şeydir. Bunun yerine, concat'i yapmadan önce onu klonlamanız gerekir.
wintondeshong


8

Ruby'de ?bu, yöntemin bir boole döndüreceği ve !çağrıldığı nesneyi değiştireceği anlamına gelir . Koda bakarken okunabilirliği artırmak için oradalar.


5

- Sanırım - programlama dillerinin çoğunun aksine ...

Ruby, yöntemlerin soru işaretleri veya ünlem işaretleriyle bitmesine izin verilir.

Geleneksel olarak, soruları yanıtlayan yöntemler (yani, Array # boş? Alıcı boşsa true döndürür) soru işaretleriyle son bulur.

Olası "tehlikeli" yöntemler (yani kendini veya argümanları değiştiren yöntemler, çıkış! Vb.), Ünlem işaretleriyle sona eren kurallardır.

From: http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/ , Bölüm Komik yöntem adları


1
Ayrıca ile biten yönteme ?yüklem yöntemleri denir.
Waseem

1

Dikkat edin, bu her zaman böyle değildir. Örneğin Ruby Array # concat http://docs.ruby-lang.org/en/2.0.0/Array.html#method-i-concat .

Kötü bir şekilde yanabileceğiniz bir şey gibi MyActiveRecordModel.column_names.concat([url]). MyActiveRecordModel ile ilgili sonraki çağrılar MyActiveRecordModel için bir 'url' sütunu aramaya ve atmaya çalışacaktır.

Bunun yerine, concat'i yapmadan önce onu klonlamanız gerekir. Neyse ki benim test süitim bunu yakaladı, ama .. dikkat!

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.