有没有更好的方法来检查Ruby中字符串的Nil或Length == 0?


169

有没有比以下更好的方法来检查字符串是否为nil或在Ruby中长度为0?

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

在C#中很方便

string.IsNullOrEmpty(myString)

有什么和Ruby类似的东西吗?


16
具有这样的if语句是多余的:“ if(condition)then true else else”。条件本身与if语句具有相同的真实性。
KaptajnKold

my_string || my_string.length == 0将引发一个NoMethodErrorif是否my_string为nil。我认为您的意思是:my_string.nil? || my_string.length == 0
年幼的2016年

1
应该!my_string || my_string.length == 0

Answers:


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可能会非常低效。
马克·安德烈

10
另一个有趣的方法是my_string.to_s.empty?
里卡多·佩索阿

对于大多数人来说,第一种选择将是完全可以接受的,而且读起来也不错。
amrcus 2014年

68

如果您需要ActiveSupport,则可以使用#blank?为NilClass和String定义的方法。


15
请注意,仅包含空格的字符串仍被认为是空白。那么“ ..blank?是真的。
格兰特·哈钦斯

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
但是..但是.. ruby​​核心库已经实现了这一点。nil.to_s =>“”,所以您可以说thingle.to_s ==“”
DigitalRoss 2011年

1
@DigitalRoss这样可以避免字符串转换,这可能会或可能不会造成轻微的性能问题。
Vortico 2014年

30

就像之前在Rails(ActiveSupport)上说的方便吗?方法,其实现方式如下:

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

很容易添加到任何基于红宝石的项目中。

该解决方案的优点在于,它不仅对字符串有效而且对数组和其他类型都有效。



13

nil?在布尔上下文中可以省略。通常,您可以使用它来复制C#代码:

return my_string.nil? || my_string.empty?

7

首先,请注意该方法:

正如Jesse 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或Monkey-patching来解决这里的常见用例。例如:

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)

因此,反过来检查零长度或零长度使用 !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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.