Đôi khi tôi thấy các phương thức trong Ruby có "?" và "!" ở cuối chúng, ví dụ:
name = "sample_string"
name.reverse
name.reverse!
name.is_binary_data?
Tôi đã tự hỏi mục đích của họ là gì? Chúng chỉ là lớp phủ theo cú pháp?
Đôi khi tôi thấy các phương thức trong Ruby có "?" và "!" ở cuối chúng, ví dụ:
name = "sample_string"
name.reverse
name.reverse!
name.is_binary_data?
Tôi đã tự hỏi mục đích của họ là gì? Chúng chỉ là lớp phủ theo cú pháp?
Câu trả lời:
Nó "chỉ là lớp phủ" để dễ đọc, nhưng chúng có ý nghĩa chung:
!
việc thực hiện một số thay đổi vĩnh viễn hoặc tiềm ẩn nguy hiểm ; ví dụ:
Enumerable#sort
trả về một phiên bản được sắp xếp của đối tượng trong khi Enumerable#sort!
sắp xếp nó tại chỗ.ActiveRecord::Base#save
trả về false nếu lưu không thành công, đồng thời ActiveRecord::Base#save!
đưa ra một ngoại lệ.Kernel::exit
khiến một tập lệnh thoát ra, trong khi Kernel::exit!
làm như vậy ngay lập tức, bỏ qua bất kỳ trình xử lý thoát nào.?
boolean , làm cho dòng mã thậm chí còn trực quan hơn giống như một câu - if number.zero?
đọc như "nếu số bằng 0", nhưng if number.zero
trông thật kỳ lạ.Trong ví dụ của bạn, name.reverse
đánh giá là một chuỗi được đảo ngược, nhưng chỉ sau name.reverse!
dòng thì name
biến mới thực sự chứa tên được đảo ngược. name.is_binary_data?
trông giống như "là name
dữ liệu nhị phân?".
Array#clear
, chẳng hạn. Nó xóa mảng. Xóa mảng tự nhiên sẽ làm thay đổi nó. Không có gì đáng ngạc nhiên về điều đó, do đó, cái tên đã làm cho nó rõ ràng: không có tiếng nổ. Xem ruby-forum.com/topic/176830#773946 .
Dấu hỏi cho biết rằng phương thức trả về boolean. Đã được trả lời ở đây:
Toán tử dấu hỏi có nghĩa là gì trong Ruby?
Tiếng nổ chỉ ra rằng phương thức tác động lên chính đối tượng. Đã được trả lời ở đây:
Tại sao các dấu chấm than được sử dụng trong các phương thức Ruby?
Trong Ruby ?
, phương thức này sẽ trả về một boolean và phương thức này sẽ !
sửa đổi đối tượng mà nó được gọi. Chúng ở đó để cải thiện khả năng đọc khi xem mã.
Ngược lại với - tôi cho là - phần lớn các ngôn ngữ lập trình ...
Ruby, các phương thức được phép kết thúc bằng dấu chấm hỏi hoặc dấu chấm than.
Theo quy ước, các phương thức trả lời câu hỏi (tức là Mảng # rỗng? Trả về true nếu bộ nhận trống) kết thúc bằng dấu hỏi.
Các phương thức tiềm ẩn “nguy hiểm” (tức là các phương thức tự sửa đổi bản thân hoặc các đối số, thoát! V.v.) theo quy ước kết thúc bằng dấu chấm than.
Từ: http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/ , Mục Tên phương pháp vui nhộn
?
được gọi là phương thức vị từ.
Hãy cẩn thận, điều này không phải luôn luôn như vậy. Lấy ví dụ, Ruby Array # concat http://docs.ruby-lang.org/en/2.0.0/Array.html#method-i-concat .
Nơi bạn có thể bị bỏng nặng là một cái gì đó MyActiveRecordModel.column_names.concat([url])
. Các lệnh gọi sau này liên quan đến MyActiveRecordModel sẽ cố gắng tìm kiếm một cột 'url' cho MyActiveRecordModel và ném.
Thay vào đó, bạn phải sao chép nó trước khi thực hiện concat. May mắn thay, bộ thử nghiệm của tôi đã bắt được cái này, nhưng .. hãy chú ý!