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

时间:2008-10-29 18:46:24

标签: ruby

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

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

在C#中有方便的

string.IsNullOrEmpty(myString)

与Ruby类似的东西?

16 个答案:

答案 0 :(得分:219)

当我不担心表现时,我会经常使用它:

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

答案 1 :(得分:67)

如果您愿意要求ActiveSupport,您可以使用#blank?方法,该方法是为NilClass和String定义的。

答案 2 :(得分:61)

我喜欢这样做(在非Rails / ActiveSupport环境中):

variable.to_s.empty?

这是因为:

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

答案 3 :(得分:31)

jcoby提案的替代方案是:

class NilClass
  def nil_or_empty?
    true
  end
end

class String
  def nil_or_empty?
    empty?
  end
end

答案 4 :(得分:29)

正如在Rails(ActiveSupport)之前所说的那样,它有一个方便的blank?方法,它实现如下:

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

很容易添加到任何基于ruby的项目。

这个解决方案的优点在于它不仅适用于字符串,而且适用于阵列和其他类型。

答案 5 :(得分:15)

variable.blank?会做的。 如果字符串为空或字符串为nil,则返回true。

答案 6 :(得分:12)

在布尔上下文中可以省略

nil?。通常,您可以使用它来复制C#代码:

return my_string.nil? || my_string.empty?

答案 7 :(得分:7)

首先,要注意这种方法:

正如Jesse Ezel所说:

  

Brad Abrams

     
    

“这种方法似乎很方便,但大多数时候我发现这种情况来自于试图掩盖更深层次的错误。

  
     

您的代码应该坚持使用字符串的特定协议,您应该了解协议在库代码和您正在使用的代码中的使用。

     

NullOrEmpty协议通常是一个快速修复(所以真正的问题仍然在其他地方,你有两个协议在使用)或者在实现新代码时缺乏特定协议的专业知识(同样,你应该真的知道你的回报值是什么。)“

如果您修补String类...请确保NilClass has not been patch either

class NilClass
    def empty?; true; end
end

答案 8 :(得分:5)

每个班级都有一个nil?方法:

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

字符串包含empty?方法:

if a_string.empty?
    # the string is empty
}

请记住,当字符串为空时,字符串等于nil,因此请使用empty?方法检查字符串是否为空。

答案 9 :(得分:4)

另一个选择是动态地将nil转换为空结果:

(my_string||'').empty?

答案 10 :(得分:2)

Konrad Rudolph有正确的答案。

如果它真的让你烦恼,那么猴子修补String类或将它添加到你选择的类/模块中。除非你有一个非常令人信服的理由,否则修补核心对象真的不是一个好习惯。

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

然后你可以String.nilorempty? mystring

答案 11 :(得分:2)

检查纯Ruby中的空字符串,同时避免NameError异常

这里有一些很好的答案,但你不需要ActiveSupport或猴子修补来解决这里的常见用例。例如:

my_string.to_s.empty? if defined? my_string

这将"做正确的事情"如果 my_string 为nil或空字符串,但如果未定义 my_string ,则不会引发NameError exception。这通常比较做作的人更可取:

my_string.to_s.empty? rescue NameError

或其更加冗长的同类,因为您 期待发生的事情应该真正保存例外情况。在这种情况下,尽管它可能是一个常见的错误,但未定义的变量实际上并不是一个特例,所以应该相应地处理它。

您的里程可能会有所不同。

答案 12 :(得分: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?

答案 13 :(得分:1)

如果您使用滑轨,则可以使用.as-console-wrapper { max-height: 100% !important; top: 0; }

#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?

答案 14 :(得分:0)

对于标准高尔夫球手(需要ruby 2.3或更高版本):

if my_string&.> ""
  p 'non-empty string'
else
  p 'nil or empty string'
end

答案 15 :(得分:0)

您可以尝试使用#blank?

警告:当字符串由空格组成时,它将为您带来肯定:

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

只想指出这一点。也许适合您的需求

UPD。为什么我的供稿中出现老问题? 抱歉,不能发布。