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

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

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

在 C # 里有个便利的

string.IsNullOrEmpty(myString)

Ruby 有类似的吗?

129088 次浏览

每个类都有一个 nil?方法:

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

字符串具有 empty?方法:

if a_string.empty?
# the string is empty
}

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

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

return my_string.nil? || my_string.empty?

康拉德 · 鲁道夫的回答是正确的。

如果它真的让您感到困扰,那么 Monkey 可以修补 String 类或者将其添加到您选择的类/模块中。除非你有一个非常有说服力的理由,否则这确实不是一个修补核心对象的好方法。

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

然后你可以做 String.nilorempty? mystring

对于 jcoby 的提议,另一个选择是:

class NilClass
def nil_or_empty?
true
end
end


class String
def nil_or_empty?
empty?
end
end

首先,要小心这种方法:

正如 Jesse Ezel所言:

Brad Abrams

“这种方法可能看起来很方便,但大多数时候,我发现这种情况是因为试图掩盖更深层次的错误而出现的。

您的代码应该遵守关于字符串使用的特定协议,并且您应该理解协议在库代码和正在使用的代码中的使用。

NullOrEmpty 协议是一个典型的快速解决方案(所以真正的问题还在其他地方,你有两个正在使用的协议) ,或者在实现新代码时缺乏特定协议的专业知识(再次强调,你应该真正知道你的返回值是什么)。”

如果你修补字符串类... 确保 NilClass 也没有被修补

class NilClass
def empty?; true; end
end

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

正如之前所说的,Rails (ActiveSupport)有一个方便的 空白?方法,它是这样实现的:

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

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

这个解决方案的美妙之处在于,它不仅对 String 自动神奇地工作,而且对 Array 和其他类型也是如此。

当我不担心表现的时候,我会经常使用这个:

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

- 变量,空白?-可以。 如果字符串为空或者字符串为空,则返回 true。

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

variable.to_s.empty?

这是因为:

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

在普通 Ruby 中检查空字符串,同时避免 NameError 异常

这里有一些很好的答案,但是您不需要 ActiveSupport 或者补丁来解决这里的常见用例。例如:

my_string.to_s.empty? if defined? my_string

如果 我的绳子为空或为空字符串,这将“做正确的事情”,但如果没有定义 我的绳子,则不会引发 NameError 异常。一般而言,这比较人为的做法更可取:

my_string.to_s.empty? rescue NameError

或者更加冗长的同类,因为异常应该真正保存为 不要期望发生的事情。在这种情况下,虽然它可能是一个常见错误,但是未定义的变量并不是真正的异常情况,因此应该相应地进行处理。

你的情况可能会有所不同。

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

(my_string||'').empty?

代码高尔夫球手:

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

在轨道上你可以尝试 #blank?

警告: 当字符串由空格组成时,它会给出正值:

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

我只是想指出来,也许这符合你的需要

UPD 为什么我的视频里有老问题? 抱歉尸检。

你试过“精致”吗?

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?

如果您正在使用 Rail,则可以使用 #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