Soru işareti operatörü Ruby'de ne anlama geliyor?


211

Ruby'deki soru işareti operatörünün amacı nedir?

Bazen şöyle görünür:

assert !product.valid?

bazen bir ifyapıdadır.


2
Bir fonksiyonun sonundaki soru işareti bir operatör değil, sıradan bir karakterdir. İki nokta üst üste işareti ile birlikte üçlü bir koşullu işleçtir. Soru işareti tek başına tek tırnaklı bir operatördür. Bkz. Stackoverflow.com/questions/16641205/…
Old Pro

Yanıtlar:


296

Bir kod stili kuralıdır; bir yöntemin bir boole değeri döndürdüğünü gösterir.

Soru işareti, bir yöntem adının sonundaki geçerli bir karakterdir.


9
Teşekkürler, ancak bu sözleşme sadece mantık yaptığı anlamına mı geliyor yoksa yan etkiler olabilir mi? Komik, bu tür bir kod etrafında dönüş türü ile yazılmış bir hack nasıl.
Jason

5
Bu durumda, kesinlikle konvansiyon adlandırma yöntemidir. Boole dönüş değerinin uygulanması yoktur. Yöntem adının bir soru işaretiyle bitmesi, yöntemin bir boole döndürmesi gerektiği anlamına gelmez ... ama kesinlikle bir boole döndürmesi gerekir . Bununla birlikte ?, Ruby'nin (bir karakteri ASCII tamsayısına dönüştüren test, RegEx'lerde kullanım , vb.) Birçok başka kullanımı vardır , bunların çoğu burada diğer cevaplarda yer almaktadır.
Karl Wilbur

4
@ Jason FYI, güçlü yazılan diller bile böyle sözleşmelere sahiptir. Örneğin, bir boole değeri döndüren Java yöntemlerinde, genellikle "is"isEmpty() , isDigit()vb olarak Yakut, aynı yöntemler yazılı olacaktır empty?ve digit?biraz daha güzel IMO olan.
Ajedi32

3
Ajedi32 - Evet, böyle işlevlere isim vermenin güzel olduğunu kabul ediyorum, kullanıyorum is her zaman kullanıyorum. Bu süper soru işareti beri Swift gelen birisi için kafa karıştırıcı olabilir orada kullanılır nullable:)
Jason

83

Ayrıca ?bir karakterle birlikte, ASCII karakter kodunu döndüreceğini unutmayın .A

Örneğin:

?F # => will return 70

Alternatif olarak yakut 1.8'de şunları yapabilirsiniz:

"F"[0]

veya yakut 1.9'da:

"F".ord

Ayrıca ?F, dizeyi döndüreceğine dikkat edin "F", bu nedenle kodu kısaltmak ?F.ordiçin, aynı sonucu elde etmek için Ruby 1.9'da da kullanabilirsiniz "F".ord.


29
Yakut 1.9 içinde dönecektir'F'
klew

39

Ruby'de, boole değerlerini döndüren yöntemlerin bir soru işaretiyle sona erdiği bir kural. Bundan daha fazla önemi yok.


28

Örneğinizde, yöntem adının sadece bir parçasıdır. Ruby'de yöntem adlarında ünlem işaretleri de kullanabilirsiniz!

Ruby'deki soru işaretlerinin bir başka örneği üçlü operatör olabilir.

customerName == "Fred" ? "Hello Fred" : "Who are you?"

13
Andy'nin cevabını genişletmek için aşağıdaki gibi şeyleri de göreceksiniz: customerName == user.oked_in? ? user.name: "Siz kimsiniz?" Çift soru işaretini not edin
Soru İşareti

16

Örneğinizde

product.valid?

Aslında bir işlev çağrısı ve adlı bir işlevi çağırır valid?. Belirli "koşul testi" / boole işlevlerinin geleneksel olarak işlev adının bir parçası olarak soru işareti vardır.


41
answer.gsub! (/ function /, 'method')
glenn jackman

15

?Değişkenlere değil, yalnızca yöntem adlarında izin verildiğine dikkat çekmek gerekebilir . Ruby öğrenme sürecinde, ?bir boole dönüş türü belirlediğini varsaydım, bu yüzden onları bayrak değişkenlerine eklemeye çalıştım ve hatalara yol açtım. Bu bana bir süreliğine yanlışlıkla ?s'yi içeren bazı özel sözdizimi olduğuna inanmamı sağladı .

İlgili: Yöntem adı olabilirken neden bir değişken ismi `? 'İle bitemez?


9

Bence bu sadece boolean şeyler için bir kongre. Biraz " IsValid" demek gibi .


1
özlü ve harika yorum özel "Biraz" IsValid "
demek

2

Ayrıca "önceki karakterin en fazla bir tekrarı" anlamına gelen normal ifadelerde de kullanılır

örneğin, normal ifade /hey?/ " he" ve " hey" dizeleriyle eşleşir .


0

Ayrıca , Çekirdek # testindeki test yönteminin ilk argümanıyla birlikte kullanılan yaygın bir kuraldır.

irb(main):001:0> test ?d, "/dev" # directory exists?
=> true
irb(main):002:0> test ?-, "/etc/hosts", "/etc/hosts" # are the files identical
=> true

burada bu soruda görüldüğü gibi


3
İle ilgili değil test, ?dkısayoludur "d". testilk argüman olarak tek karakterlik bir dize alır, böylece test ?d, "/dev"veya ile çağırabilirsiniz test "d", "/dev".
bfontaine
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.