Có cách nào tốt hơn để kiểm tra Nil hoặc Độ dài == 0 của một chuỗi trong Ruby không?


169

Có cách nào tốt hơn cách sau để kiểm tra xem chuỗi có bằng 0 hay không có độ dài bằng 0 trong Ruby?

if !my_string || my_string.length == 0
  return true
else
  return false
end

Trong C # có tiện dụng

string.IsNullOrEmpty(myString)

Bất cứ điều gì tương tự như trong Ruby?


16
Thật dư thừa khi có một câu lệnh if như thế này: "if (condition) thì true other false". Điều kiện tự nó có tính trung thực giống như câu lệnh if.
KaptajnKold

my_string || my_string.length == 0sẽ tăng một NoMethodErrornếu my_stringlà con số không. Tôi nghĩ bạn có nghĩa là:my_string.nil? || my_string.length == 0
Naveed

1
Nên là!my_string || my_string.length == 0
levsa

Câu trả lời:


224

Khi tôi không lo lắng về hiệu suất, tôi sẽ thường sử dụng điều này:

if my_string.to_s == ''
  # It's nil or empty
end

Có nhiều biến thể khác nhau, tất nhiên ...

if my_string.to_s.strip.length == 0
  # It's nil, empty, or just whitespace
end

2
Các biến thể sử dụng stripcó thể khá không hiệu quả.
Marc-André Lafortune

10
một cách thú vị khác là my_opes.to_s.empty?
Ricardo Pessoa

Đối với hầu hết mọi người, tùy chọn đầu tiên sẽ hoàn toàn được chấp nhận và đọc tốt.
amrcus

68

Nếu bạn sẵn sàng yêu cầu ActiveSupport, bạn chỉ có thể sử dụng #blank?phương thức được xác định cho cả NilClass và String.


15
Lưu ý rằng một Chuỗi chỉ chứa khoảng trắng vẫn được coi là trống. Vậy "" .blank? là đúng.
Cấp Hutchins

2
Ngoài ra, boolean false, {} và [] được coi là trống. Tức là {} .blank?, [] .Blank?, False.blank? Tất cả đánh giá là đúng.
ShaharZ

64

Tôi thích làm điều này như sau (trong môi trường không có Rails / ActiveSupport):

variable.to_s.empty?

Điều này hoạt động vì:

nil.to_s == ""
"".to_s == ""

3
Một lời giải thích tốt tại sao string.to_s.empty?làm việc cho cả hai nil"".
georger

31

Một thay thế cho đề xuất của jcoby sẽ là:

class NilClass
  def nil_or_empty?
    true
  end
end

class String
  def nil_or_empty?
    empty?
  end
end

10
Nhưng .. nhưng .. Thư viện lõi ruby ​​đã thực hiện điều này. nil.to_s => "", vì vậy bạn có thể nói điều.to_s == ""
DigitalRoss

1
@DigitalRoss Điều này tránh việc chuyển đổi chuỗi có thể là một vấn đề hiệu suất nhỏ.
Vortico

30

Như đã nói ở đây trước khi Rails (ActiveSupport) có một khoảng trống tiện dụng ? phương pháp và nó được thực hiện như thế này:

class Object
  def blank?
    respond_to?(:empty?) ? empty? : !self
  end
end

Khá dễ dàng để thêm vào bất kỳ dự án dựa trên ruby.

Cái hay của giải pháp này là nó hoạt động tự động không chỉ cho Chuỗi mà còn cho Mảng và các loại khác.


15

biến.blank? sẽ làm điều đó. Nó trả về true nếu chuỗi rỗng hoặc nếu chuỗi không.


12
Trên thực tế, đây là một đường ray chỉ mở rộng, không phải là ruby ​​tinh khiết. Nhưng nếu bạn đang sử dụng đường ray thì rất tiện dụng!
James P McGrath

13

nil?có thể được bỏ qua trong bối cảnh boolean. Nói chung, bạn có thể sử dụng điều này để sao chép mã C #:

return my_string.nil? || my_string.empty?

7

Trước hết, hãy cẩn thận với phương pháp đó:

Như Jesse Ezel nói:

Brad Abrams

"Phương pháp này có vẻ thuận tiện, nhưng hầu hết thời gian tôi thấy rằng tình huống này phát sinh từ việc cố gắng che đậy những lỗi sâu hơn.

Mã của bạn phải tuân theo một giao thức cụ thể về việc sử dụng các chuỗi và bạn nên hiểu việc sử dụng giao thức trong mã thư viện và trong mã bạn đang làm việc.

Giao thức NullOrEmpty thường là một sửa chữa nhanh (vì vậy vấn đề thực sự vẫn còn ở một nơi khác và bạn có hai giao thức đang sử dụng) hoặc thiếu chuyên môn trong một giao thức cụ thể khi triển khai mã mới (và một lần nữa, bạn thực sự nên biết những gì giá trị trả về của bạn là). "

Và nếu bạn vá lớp String ... hãy chắc chắn rằng NilClass cũng không được vá !

class NilClass
    def empty?; true; end
end

5

Mỗi lớp có một nil?phương thức:

if a_variable.nil?
    # the variable has a nil value
end

Và chuỗi có empty?phương thức:

if a_string.empty?
    # the string is empty
}

Hãy nhớ rằng một chuỗi không bằng nilkhi nó trống, vì vậy hãy sử dụng empty?phương thức để kiểm tra xem một chuỗi có trống không.


4

Một lựa chọn khác là chuyển đổi con số không thành kết quả trống khi đang bay:

(my_string||'').empty?


2

Konrad Rudolph có câu trả lời đúng.

Nếu nó thực sự làm phiền bạn, khỉ sẽ vá lớp String hoặc thêm nó vào một lớp / mô-đun bạn chọn. Nó thực sự không phải là một thực hành tốt để khỉ vá các đối tượng cốt lõi trừ khi bạn có một lý do thực sự thuyết phục.

class String
  def self.nilorempty?(string)
    string.nil? || string.empty?
  end
end

Sau đó bạn có thể làm String.nilorempty? mystring


2

Kiểm tra các chuỗi rỗng trong Ruby đơn giản trong khi tránh các trường hợp ngoại lệ NameError

Có một số câu trả lời hay ở đây, nhưng bạn không cần ActiveSupport hoặc vá khỉ để giải quyết trường hợp sử dụng phổ biến ở đây. Ví dụ:

my_string.to_s.empty? if defined? my_string

Điều này sẽ "làm điều đúng đắn" nếu my_opes là nil hoặc một chuỗi rỗng, nhưng sẽ không đưa ra một ngoại lệ NameError nếu my_ chuỗi không được xác định. Điều này thường được ưa thích hơn đối với những người có kế hoạch hơn:

my_string.to_s.empty? rescue NameError

hoặc ilkse dài hơn của nó, bởi vì các trường hợp ngoại lệ thực sự nên được lưu cho những điều bạn không mong muốn xảy ra. Trong trường hợp này, mặc dù có thể là một lỗi phổ biến, một biến không xác định không thực sự là một trường hợp ngoại lệ, do đó, nó cần được xử lý tương ứng.

Số dặm của bạn có thể thay đổi.


1

Bạn đã thử tinh chỉnh?

module Nothingness
  refine String do
    alias_method :nothing?, :empty?
  end

  refine NilClass do
    alias_method :nothing?, :nil?
  end
end

using Nothingness

return my_string.nothing?

1

Nếu bạn đang sử dụng đường ray, bạn có thể sử dụng #present?

require 'rails'

nil.present?  # ==> false (Works on nil)
''.present?    # ==> false (Works on strings)
'  '.present?  # ==> false (Works on blank strings)
[].present?    # ==> false(Works on arrays)
false.present? # ==> false (Works on boolean)

Vì vậy, ngược lại để kiểm tra sử dụng độ dài không hoặc không !present?

!(nil.present?)  # ==> true
!(''.present?)    # ==> true
!('  '.present?)  # ==> true
!([].present?)    # ==> true
!(false.present?) # ==> true

0

Trong đường ray bạn có thể thử #blank?.

Cảnh báo: nó sẽ cung cấp cho bạn tích cực khi chuỗi bao gồm khoảng trắng:

nil.blank? # ==> true
''.blank? # ==> true
'  '.blank? # ==> true
'false'.blank? # ==> false

Chỉ muốn chỉ ra nó. Có lẽ nó phù hợp với nhu cầu của bạn

CẬP NHẬT. Tại sao tôi nhận được câu hỏi cũ trong nguồn cấp dữ liệu của tôi? Xin lỗi vì đã hoại tử.


0

Đối với người chơi golf mã:

if my_string=~/./
  p 'non-empty string'
else
  p 'nil or empty string'
end

Hoặc nếu bạn không phải là người chơi gôn (yêu cầu ruby ​​2.3 trở lên):

if my_string&.size&.positive?
  # nonzero? also works
  p 'non-empty string'
else
  p 'nil or empty string'
end
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.