Ruby đã định nghĩa defined?
từ khóa giúp bạn kiểm tra xem một biến có được xác định hay không.
Nếu biến tồn tại, bạn sẽ nhận được loại của nó :
apple = 1 defined?(apple) # "local-variable"
Nếu không, bạn sẽ không nhận được gì :
defined?(bacon) # nil
Điều này giống như typeof
của Javascript nhà điều hành. Nếu bạn muốn biết lớp của một đối tượng, hãy sử dụng class
thay vì phương pháp này.
Một số điểm thú vị cần lưu ý:
-
defined?
là một từ khóa , không phải là phương pháp -
defined?
là một trong số ít những thứ trong Ruby kết thúc bằng dấu chấm hỏi, nhưng không tuân theo quy ước thông thường để trả vềtrue
hoặcfalse
-
defined?
có thể cho biết sự khác biệt giữa giá trị nil và một biến chưa bao giờ được đặt trước đây
Các thuộc tính đặc biệt này làm cho từ khóa này đáng để tìm hiểu.
Một cách tốt hơn để kiểm tra các biến được xác định
Từ khóa này có thể hữu ích, nhưng nó có một số vấn đề.
Tại sao?
Do mức độ ưu tiên của toán tử thấp .
Nếu bạn làm như thế này:
defined? orange && orange.size
Kết quả là "biểu thức".
Bởi vì orange && orange.size
được hiểu là đối số để defined?
.
Cách chính xác để làm điều này sẽ là:
defined?(orange) && orange.size
Ruby có những cách khác để kiểm tra xem một biến đã được xác định hay chưa.
Đối với các biến cục bộ :
local_variables.include?(:orange)
Đối với các biến ví dụ :
instance_variable_defined?("@food")
Nhưng bạn không muốn sử dụng bất kỳ cái nào trong số đó.
Trong 99% trường hợp, nếu thiếu biến cục bộ, bạn có lỗi đánh máy hoặc ai đó quên khai báo biến đó.
Còn các biến phiên bản thì sao?
Các biến phiên bản không xác định luôn là nil
, vì vậy bạn muốn kiểm tra điều đó.
Hãy thử “toán tử điều hướng an toàn” (Ruby 2.3+) chỉ gọi một phương thức nếu biến không phải là nil
.
Đây là một ví dụ :
if @user&.country == "Spain" # ... end
Điều này tương đương với :
if @user && @user.country == "Spain" # ... end
Những thứ này không phổ biến như defined?
từ khóa, nhưng chúng dễ dự đoán hơn và ít bị lỗi hơn.
Kiểm tra xem một phương pháp có được xác định không
Bạn có thể sử dụng defined?
để kiểm tra xem một phương pháp có được xác định hay không, nhưng nó không thực tế như vậy.
Ví dụ :
defined?(puts) # "method"
Vì đó là từ khóa chứ không phải là phương pháp nên bạn không thể sử dụng nó với một đối tượng.
Ý tôi là như vậy :
[].defined?(:size) # undefined method `defined?' for []:Array
Bạn đang tìm kiếm respond_to?
phương pháp.
Đây là cách sử dụng nó :
[].respond_to?(:size) # true [].respond_to?(:orange) # false
Kiểm tra xem có lớp nào không
Ví dụ :
defined?(Object) # "constant" defined?(A) # nil
Một lựa chọn tốt hơn là sử dụng const_defined?
phương pháp.
Như thế này :
Object.const_defined?(:String) # true Object.const_defined?(:A) # false
Tóm tắt
Vậy là xong, bạn đã học được một cách dễ dàng để kiểm tra xem một biến, lớp hoặc phương thức đã cho có tồn tại hay không!
Khi làm việc với các biến, điều bạn muốn nhất là kiểm tra nil
, thay vì liệu một biến có được xác định hay không. Hoặc thậm chí tốt hơn, chuyển đổi biến thành một lớp đã biết bằng cách sử dụng phương thức chuyển đổi.
Tôi hy vọng bạn thấy bài viết này hữu ích! Nếu bạn đã làm, vui lòng chia sẻ nó để nhiều người có thể thưởng thức nó.