Apa tujuan dari operator tanda tanya di Ruby?
Terkadang muncul seperti ini:
assert !product.valid?
kadang-kadang dalam if
konstruksi.
Apa tujuan dari operator tanda tanya di Ruby?
Terkadang muncul seperti ini:
assert !product.valid?
kadang-kadang dalam if
konstruksi.
Jawaban:
Ini adalah konvensi gaya kode; itu menunjukkan bahwa suatu metode mengembalikan nilai boolean.
Tanda tanya adalah karakter yang valid di akhir nama metode.
?
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.
isEmpty()
, isDigit()
, dll Ruby, metode yang sama akan ditulis empty?
, dan digit?
yang sedikit lebih bagus IMO.
is
sepanjang waktu. Ini mungkin yang super membingungkan bagi seseorang yang berasal dari Swift sejak tanda tanya ada digunakan untuk nullable
:)
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 ?F
akan mengembalikan string "F"
, jadi untuk membuat kode lebih pendek, Anda juga dapat menggunakan ?F.ord
di Ruby 1.9 untuk mendapatkan hasil yang sama "F".ord
.
'F'
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?"
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.
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?
Saya percaya itu hanya konvensi untuk hal-hal yang boolean. Agak suka mengatakan " IsValid
".
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
".
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
test
, ?d
adalah jalan pintas untuk "d"
. test
mengambil string satu karakter sebagai argumen pertama, jadi Anda bisa menyebutnya dengan test ?d, "/dev"
atau test "d", "/dev"
.