Ruby에서 문자열의 Nil 또는 Length == 0을 확인하는 더 좋은 방법이 있습니까?


169

Ruby에서 문자열이 0인지 또는 길이가 0인지 확인하는 다음보다 나은 방법이 있습니까?

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

C #에는 편리한 것이 있습니다

string.IsNullOrEmpty(myString)

루비와 비슷한 점이 있습니까?


16
"if (condition) then true else false"와 같은 if 문은 중복되지 않습니다. 조건 자체는 if 문과 동일한 진실성을 갖습니다.
KaptajnKold

my_string || my_string.length == 0을 올릴 NoMethodError경우 my_string무기 호입니다. 나는 당신이 의미하는 것 같아 :my_string.nil? || my_string.length == 0
Naveed

1
그것은이어야한다!my_string || my_string.length == 0
levsa

답변:


224

성능에 대해 걱정하지 않으면 다음을 자주 사용합니다.

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

물론 다양한 변형이 있습니다 ...

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

2
사용하는 변형 strip은 매우 비효율적 일 수 있습니다.
Marc-André Lafortune

10
또 다른 흥미로운 방법은 my_string.to_s.empty?
Ricardo Pessoa

대부분의 사람들에게 첫 번째 옵션은 완전히 수용 가능하며 잘 읽습니다.
amrcus

68

ActiveSupport가 필요하면 #blank?NilClass와 String 모두에 대해 정의 된 메소드를 사용하면 됩니다.


15
공백 만 포함 된 문자열은 여전히 ​​공백으로 간주됩니다. "".blank? 사실이다.
Grant Hutchins 님

2
또한 부울 false, {} 및 []는 공백으로 간주됩니다. 즉 {} .blank ?, [] .blank ?, false.blank? 모두 참으로 평가됩니다.
ShaharZ

64

나는 이것을 Rails / ActiveSupport가 아닌 환경에서 다음과 같이하고 싶다 :

variable.to_s.empty?

이것은 다음과 같은 이유로 작동합니다.

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

3
좋은 설명은 이유를 string.to_s.empty?모두 작동 nil하고 "".
georger

31

jcoby의 제안에 대한 대안은 다음과 같습니다.

class NilClass
  def nil_or_empty?
    true
  end
end

class String
  def nil_or_empty?
    empty?
  end
end

10
그러나 .. 그러나 .. 루비 코어 라이브러리는 이미 이것을 구현하고 있습니다. nil.to_s => "", 그래서 말할 수 있습니다. thing.to_s == ""
DigitalRoss

1
@DigitalRoss 약간의 성능 문제 일 수도 있고 아닐 수도있는 문자열 변환을 피합니다.
Vortico

30

Rails (ActiveSupport)가 편리한 공백을 갖기 전에 여기에서 말했듯이 ? 메소드와 다음과 같이 구현됩니다.

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

루비 기반 프로젝트에 쉽게 추가 할 수 있습니다.

이 솔루션의 장점은 문자열뿐만 아니라 배열 및 기타 유형에서도 자동으로 작동한다는 것입니다.


15

variable.blank? 할 것입니다. 문자열이 비어 있거나 문자열이 nil이면 true를 리턴합니다.


12
실제로 이것은 순수한 루비가 아닌 레일 전용 확장입니다. 그러나 레일을 사용하는 경우 매우 편리합니다!
James P McGrath

13

nil?부울 컨텍스트에서는 생략 할 수 있습니다. 일반적으로 이것을 사용하여 C # 코드를 복제 할 수 있습니다.

return my_string.nil? || my_string.empty?

7

우선, 그 방법에주의하십시오 :

제시 Ezel는 말합니다 :

브래드 아브람

"이 방법은 편리해 보이지만 대부분의 경우이 상황은 더 깊은 버그를 해결하려고 시도하는 것으로 나타났습니다.

코드는 문자열 사용시 특정 프로토콜을 고수해야하며 라이브러리 코드 및 작업중인 코드에서 프로토콜 사용을 이해해야합니다.

NullOrEmpty 프로토콜은 일반적으로 빠른 수정 (실제 문제는 여전히 다른 곳에 있으며 두 개의 프로토콜이 사용 중임)이거나 새 코드를 구현할 때 특정 프로토콜에 대한 전문 지식이 부족합니다. 반환 값은 ")입니다."

그리고 String 클래스를 패치하면 NilClass도 패치되지 않았 는지 확인하십시오 !

class NilClass
    def empty?; true; end
end

5

모든 수업에는 다음과 같은 nil?방법이 있습니다.

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

문자열에는 다음과 같은 empty?방법이 있습니다.

if a_string.empty?
    # the string is empty
}

문자열 은 비어있을 때 같지 않으므로 문자열을 nil비우는 empty?방법을 사용하십시오 .


4

또 다른 옵션은 nil을 빈 결과로 즉시 변환하는 것입니다.

(my_string||'').empty?


2

Konrad Rudolph가 정답입니다.

실제로 버그가 발생하면 원숭이는 String 클래스를 패치하거나 선택한 클래스 / 모듈에 추가합니다. 정말 중요한 이유가 없다면 핵심 객체를 원숭이 패치하는 것은 좋은 습관이 아닙니다.

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

그럼 넌 할 수있어 String.nilorempty? mystring


2

NameError 예외를 피하면서 일반 Ruby에서 빈 문자열 확인

여기에 좋은 답변이 있지만 일반적인 사용 사례를 해결하기 위해 ActiveSupport 또는 원숭이 패치가 필요하지 않습니다. 예를 들면 다음과 같습니다.

my_string.to_s.empty? if defined? my_string

my_string 이 nil이거나 빈 문자열 이면 "올바른 일"을 수행 하지만 my_string 이 정의되지 않은 경우 NameError 예외 가 발생하지 않습니다. 이것은 일반적으로 더 고안된 것보다 바람직합니다.

my_string.to_s.empty? rescue NameError

예상치 못한 일에 대해서는 예외를 저장해야하므로 더 자세한 정보 가 필요 합니다. 이 경우 일반적인 오류 일 수 있지만 정의되지 않은 변수는 실제로 예외적 인 상황이 아니므로 그에 따라 처리해야합니다.

귀하의 마일리지가 다를 수 있습니다.


1

상세 검색을 시도 했습니까?

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

레일을 사용하는 경우 #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)

따라서 반대로 0 또는 길이가 0인지 확인하십시오. !present?

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

0

레일에서 시도해 볼 수 있습니다 #blank?.

경고 : 문자열이 공백으로 구성되면 긍정적 인 결과를 줄 것입니다.

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

그냥 지적하고 싶었습니다. 어쩌면 그것은 당신의 요구에 적합

UPD. 피드에 왜 오래된 질문이 있습니까? 네크로 포스트가 유감입니다.


0

코드 골퍼의 경우 :

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

또는 골퍼가 아닌 경우 (ruby 2.3 이상 필요) :

if my_string&.size&.positive?
  # nonzero? also works
  p 'non-empty string'
else
  p 'nil or empty string'
end
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.