Mục đích của toán tử dấu hỏi trong Ruby là gì?
Đôi khi nó xuất hiện như thế này:
assert !product.valid?
đôi khi nó trong một if
cấu trúc.
Mục đích của toán tử dấu hỏi trong Ruby là gì?
Đôi khi nó xuất hiện như thế này:
assert !product.valid?
đôi khi nó trong một if
cấu trúc.
Câu trả lời:
Đó là một quy ước kiểu mã; nó chỉ ra rằng một phương thức trả về giá trị boolean.
Dấu hỏi là một ký tự hợp lệ ở cuối tên phương thức.
?
trong Ruby (là toán tử ternary, chuyển đổi một ký tự thành số nguyên ASCII của nó, sử dụng test
trong RegEx'es, v.v.) nhiều trong số đó được đề cập trong các câu trả lời khác ở đây.
isEmpty()
, isDigit()
vv Trong Ruby, các phương pháp tương tự sẽ được viết empty?
, và digit?
đó là khá một chút đẹp hơn IMO.
is
mọi lúc. Điều này có thể gây nhầm lẫn cho ai đó đến từ Swift vì dấu hỏi được sử dụng cho nullable
:)
Cũng lưu ý ?
cùng với một ký tự, sẽ trả về mã ký tự ASCII choA
Ví dụ:
?F # => will return 70
Luân phiên trong ruby 1.8 bạn có thể làm:
"F"[0]
hoặc trong ruby 1.9:
"F".ord
Cũng lưu ý rằng ?F
sẽ trả về chuỗi "F"
, vì vậy để làm cho mã ngắn hơn, bạn cũng có thể sử dụng ?F.ord
trong Ruby 1.9 để có kết quả tương tự như "F".ord
.
'F'
Trong ví dụ của bạn, nó chỉ là một phần của tên phương thức. Trong Ruby, bạn cũng có thể sử dụng dấu chấm than trong tên phương thức!
Một ví dụ khác về các dấu hỏi trong Ruby sẽ là toán tử ternary.
customerName == "Fred" ? "Hello Fred" : "Who are you?"
Trong ví dụ của bạn
product.valid?
Thực sự là một chức năng gọi và gọi một chức năng có tên valid?
. Một số loại "kiểm tra điều kiện" / hàm boolean nhất định có dấu chấm hỏi như một phần của tên hàm theo quy ước.
Có thể chỉ ra rằng ?
s chỉ được phép trong tên phương thức, không phải biến. Trong quá trình học Ruby, tôi giả định rằng đã ?
chỉ định loại trả về boolean nên tôi đã thử thêm chúng vào các biến cờ, dẫn đến lỗi. Điều này dẫn đến việc tôi đã sai lầm khi tin rằng có một số cú pháp đặc biệt liên quan đến ?
s.
Có liên quan: Tại sao tên biến không thể kết thúc bằng `?` Trong khi tên phương thức có thể?
Tôi tin rằng đó chỉ là một quy ước cho những thứ mang tính boolean. Một chút như nói " IsValid
".
Nó cũng được sử dụng trong các biểu thức chính quy, có nghĩa là "nhiều nhất một lần lặp lại của ký tự trước"
ví dụ: biểu thức chính quy /hey?/
khớp với các chuỗi " he
" và " hey
".
Đây cũng là một quy ước phổ biến để sử dụng với đối số đầu tiên của phương thức thử nghiệm từ Kernel # test
irb(main):001:0> test ?d, "/dev" # directory exists?
=> true
irb(main):002:0> test ?-, "/etc/hosts", "/etc/hosts" # are the files identical
=> true
như đã thấy trong câu hỏi này ở đây
test
, ?d
là một phím tắt cho "d"
. test
lấy một chuỗi một char làm đối số đầu tiên của nó, vì vậy bạn có thể gọi nó bằng test ?d, "/dev"
hoặc test "d", "/dev"
.