Computer >> Máy Tính >  >> Lập trình >> Ruby

Cách kiểm tra xem một biến có được xác định trong Ruby hay không

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ặc false
  • 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ó.