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.

rtacconi
sumber
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.

chillitom
sumber
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.

Greg Osuri
sumber
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.

Eifion
sumber
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?"
Andy Gaskell
sumber
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.

Timo Geusch
sumber
41
answer.gsub! (/ function /, 'method')
glenn jackman
15

Mungkin perlu menunjukkan bahwa ?s hanya diperbolehkan dalam nama metode, bukan variabel. Dalam proses belajar Ruby, saya berasumsi bahwa ?ditunjuk tipe boolean return jadi saya mencoba menambahkannya ke variabel flag, yang mengarah ke kesalahan. Ini membuat saya salah percaya untuk sementara waktu bahwa ada beberapa sintaks khusus yang melibatkan ?s.

Relevan: Mengapa nama variabel tidak bisa diakhiri dengan `?` Sementara nama metode bisa?

Rich Smith
sumber
9

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

Neil Barnwell
sumber
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".

José Joel.
sumber
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

jtzero
sumber
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