Apa arti dari operator tanda tanya di Ruby?


211

Apa tujuan dari operator tanda tanya di Ruby?

Terkadang muncul seperti ini:

assert !product.valid?

kadang-kadang dalam ifkonstruksi.


2
Tanda tanya di akhir fungsi bukan operator, ini karakter biasa. Tanda tanya bersama dengan titik dua adalah operator kondisional ternary. Tanda tanya dengan sendirinya adalah operator kutipan unary. Lihat stackoverflow.com/questions/16641205/…
Old Pro

Jawaban:


296

Ini adalah konvensi gaya kode; itu menunjukkan bahwa suatu metode mengembalikan nilai boolean.

Tanda tanya adalah karakter yang valid di akhir nama metode.


9
Terima kasih, tetapi apakah konvensi ini berarti hanya logika atau mungkinkah ada efek samping? Lucu bagaimana ini semacam peretasan di sekitar bahasa yang diketik dengan jenis pengembalian dalam kode.
Jason

5
Jika hal ini benar-benar metode konvensi penamaan. Tidak ada penegakan nilai pengembalian boolean. Hanya karena nama metode diakhiri dengan tanda tanya tidak berarti bahwa metode tersebut harus mengembalikan boolean ... tetapi yang paling pasti harus mengembalikan boolean. Namun ada beberapa kegunaan lain ?di Ruby (adalah operator ternary, mengubah karakter menjadi integer ASCII-nya, penggunaan dalam test, di RegEx'es, dll.) Yang banyak di antaranya tercakup dalam jawaban lain di sini.
Karl Wilbur

4
@Jason FYI, bahkan bahasa yang sangat diketik memiliki konvensi seperti ini. Misalnya, di Jawa metode yang mengembalikan nilai boolean sering diawali dengan "adalah", seperti dalam isEmpty(), isDigit(), dll Ruby, metode yang sama akan ditulis empty?, dan digit?yang sedikit lebih bagus IMO.
Ajedi32

3
Ajedi32 - Ya saya setuju itu bagus untuk nama fungsi seperti itu, saya gunakan issepanjang waktu. Ini mungkin yang super membingungkan bagi seseorang yang berasal dari Swift sejak tanda tanya ada digunakan untuk nullable:)
Jason

83

Juga perhatikan ?bersama dengan karakter, akan mengembalikan kode karakter ASCII untukA

Sebagai contoh:

?F # => will return 70

Bergantian di ruby ​​1.8 Anda dapat melakukan:

"F"[0]

atau di ruby ​​1.9:

"F".ord

Perhatikan juga bahwa ?Fakan mengembalikan string "F", jadi untuk membuat kode lebih pendek, Anda juga dapat menggunakan ?F.orddi Ruby 1.9 untuk mendapatkan hasil yang sama "F".ord.


29
Dalam ruby ​​1.9 itu akan kembali'F'
klik

39

Ini adalah konvensi di Ruby bahwa metode yang mengembalikan nilai boolean diakhiri dengan tanda tanya. Tidak ada yang lebih penting dari itu.


28

Dalam contoh Anda itu hanya bagian dari nama metode. Di Ruby Anda juga dapat menggunakan tanda seru dalam nama metode!

Contoh lain dari tanda tanya di Ruby adalah operator ternary.

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

13
Untuk memperluas jawaban Andy, Anda juga akan melihat hal-hal seperti: customerName == user.logged_in? ? user.name: "Siapa kamu?" Perhatikan tanda tanya ganda
Tanya

16

Dalam contoh Anda

product.valid?

Sebenarnya adalah panggilan fungsi dan memanggil fungsi bernama valid?. Beberapa tipe "test for condition" / fungsi boolean tertentu memiliki tanda tanya sebagai bagian dari nama fungsi berdasarkan konvensi.


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


9

Saya percaya itu hanya konvensi untuk hal-hal yang boolean. Agak suka mengatakan " IsValid".


1
komentar singkat dan mengagumkan khusus "Agak seperti mengatakan" IsValid "
Kick Buttowski

2

Ini juga digunakan dalam ekspresi reguler, yang berarti "paling banyak satu pengulangan dari karakter sebelumnya"

misalnya ekspresi reguler /hey?/ cocok dengan string " he" dan " hey".


0

Ini juga merupakan konvensi umum untuk digunakan dengan argumen pertama dari metode pengujian dari uji Kernel #

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

seperti yang terlihat dalam pertanyaan ini di sini


3
Ini tidak terkait dengan test, ?dadalah jalan pintas untuk "d". testmengambil string satu karakter sebagai argumen pertama, jadi Anda bisa menyebutnya dengan test ?d, "/dev"atau test "d", "/dev".
bfontaine
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.