ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

在 C# 中很方便

string.IsNullOrEmpty(myString)

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

有这样的 if 语句是多余的:“if (condition) then true else false”。条件本身与 if 语句具有相同的真实性。
如果 my_string 为 nil,my_string || my_string.length == 0 将引发 NoMethodError。我想你的意思是:my_string.nil? || my_string.length == 0
应该是!my_string || my_string.length == 0

r
rnevius

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

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

使用 strip 的变化可能非常低效。
另一个有趣的方式是 my_string.to_s.empty?
对于大多数人来说,第一个选项是完全可以接受的,并且读起来很好。
A
Avdi

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


请注意,仅包含空格的字符串仍被视为空白。所以“”.空白?是真的。
此外,布尔值 false、{} 和 [] 被视为空白。即 {}.blank?, [].blank?, false.blank?全部评估为真。
V
Vinay Sahni

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

variable.to_s.empty?

这有效,因为:

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

很好地解释了为什么 string.to_s.empty?nil"" 都有效。
R
Rômulo Ceccon

jcoby 提议的替代方案是:

class NilClass
  def nil_or_empty?
    true
  end
end

class String
  def nil_or_empty?
    empty?
  end
end

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

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

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

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

这个解决方案的美妙之处在于它不仅适用于字符串而且适用于数组和其他类型。


S
Satya Kalluri

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


实际上,这只是一个 rails 扩展,而不是纯 ruby。但是,如果您使用的是 Rails,它非常方便!
K
Konrad Rudolph

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

return my_string.nil? || my_string.empty?

V
VonC

首先,请注意该方法:

正如 Jesse Ezel 所说:

Brad Abrams “该方法可能看起来很方便,但大多数时候我发现这种情况是由于试图掩盖更深层次的错误。你的代码应该坚持使用字符串的特定协议,并且你应该了解使用库代码和您正在使用的代码中的协议。NullOrEmpty 协议通常是一种快速修复(所以真正的问题仍然在其他地方,并且您有两个协议在使用中)或者它缺乏特定领域的专业知识实现新代码时的协议(同样,您应该真正知道您的返回值是什么)。”

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

class NilClass
    def empty?; true; end
end

P
Paige Ruten

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

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

字符串具有 empty? 方法:

if a_string.empty?
    # the string is empty
}

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


m
mahemoff

另一种选择是即时将 nil 转换为空结果:

(my_string||'').empty?


j
jcoby

康拉德鲁道夫有正确的答案。

如果它真的让您感到困扰,请修改 String 类或将其添加到您选择的类/模块中。除非您有真正令人信服的理由,否则猴子修补核心对象确实不是一个好习惯。

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

然后你可以做String.nilorempty? mystring


T
Todd A. Jacobs

检查纯 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

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

你的旅费可能会改变。


D
Dhivya Dandapani

如果您使用的是导轨,则可以使用 #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

R
RichOrElse

您是否尝试过细化?

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?

N
Nondv

在 Rails 中,您可以尝试 #blank?

警告:当字符串由空格组成时,它会给你肯定:

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

只是想指出来。也许它适合您的需求

UPD。为什么我的提要中出现老问题?很抱歉发布了墓志铭。


s
snipsnipsnip

对于代码高尔夫球手:

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