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

Jim*_*ato 168 ruby

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

if !my_string || my_string.length == 0
  return true
else
  return false
end
Run Code Online (Sandbox Code Playgroud)

在C#中有方便的

string.IsNullOrEmpty(myString)
Run Code Online (Sandbox Code Playgroud)

有类似于Ruby的东西吗?

小智 223

当我不担心性能时,我会经常使用它:

if my_string.to_s == ''
  # It's nil or empty
end
Run Code Online (Sandbox Code Playgroud)

  • 另一个有趣的方法是my_string.to_s.empty? (8认同)
  • 使用`strip`的变化可能非常低效. (2认同)

Avd*_*vdi 68

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

  • 请注意,仅包含空格的String仍被视为空白.所以"".blank?是真的. (15认同)
  • 同样,布尔值false,{}和[]被认为是空白。即{} .blank?,[]。blank?,false.blank?全部评估为真。 (2认同)

Vin*_*hni 63

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

variable.to_s.empty?
Run Code Online (Sandbox Code Playgroud)

这是因为:

nil.to_s == ""
"".to_s == ""
Run Code Online (Sandbox Code Playgroud)

  • 一个很好的解释,为什么`string.to_s.empty?`同时适用于`nil`和`“”`。 (3认同)

Rôm*_*con 31

jcoby提案的替代方案是:

class NilClass
  def nil_or_empty?
    true
  end
end

class String
  def nil_or_empty?
    empty?
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 但是......但是...... ruby​​核心库已经实现了这一点.nil.to_s =>"",所以你可以说thing.to_s =="" (10认同)
  • @DigitalRoss这避免了字符串转换,这可能是也可能不是轻微的性能问题。 (2认同)

Hon*_*nza 30

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

class Object
  def blank?
    respond_to?(:empty?) ? empty? : !self
  end
end
Run Code Online (Sandbox Code Playgroud)

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

这个解决方案的优点在于它不仅可以用于字符串,还可以用于阵列和其他类型.


Sat*_*uri 15

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

  • 实际上,这是仅限铁轨的延伸,而不是纯粹的红宝石.但是,如果你使用rails,它非常方便! (12认同)

Kon*_*lph 13

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

return my_string.nil? || my_string.empty?
Run Code Online (Sandbox Code Playgroud)


Von*_*onC 7

首先,要注意这种方法:

正如Jesse Ezel所说:

布拉德艾布拉姆斯

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

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

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

如果你修补String类...确保NilClass也没有补丁!

class NilClass
    def empty?; true; end
end
Run Code Online (Sandbox Code Playgroud)


Jer*_*ten 5

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

if a_variable.nil?
    # the variable has a nil value
end
Run Code Online (Sandbox Code Playgroud)

字符串有empty?方法:

if a_string.empty?
    # the string is empty
}
Run Code Online (Sandbox Code Playgroud)

请记住,字符串在空时相等nil,因此请使用该empty?方法检查字符串是否为空.