有没有比以下更好的方法来检查字符串是否为 nil 或在 Ruby 中的长度为 0?
if !my_string || my_string.length == 0
return true
else
return false
end
在 C# 中很方便
string.IsNullOrEmpty(myString)
Ruby中有什么类似的东西吗?
my_string
为 nil,my_string || my_string.length == 0
将引发 NoMethodError
。我想你的意思是:my_string.nil? || my_string.length == 0
!my_string || my_string.length == 0
当我不担心性能时,我会经常使用这个:
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
如果您愿意要求 ActiveSupport,您可以只使用为 NilClass 和 String 定义的 #blank?
方法。
我喜欢这样做(在非 Rails/ActiveSupport 环境中):
variable.to_s.empty?
这有效,因为:
nil.to_s == ""
"".to_s == ""
string.to_s.empty?
对 nil
和 ""
都有效。
jcoby 提议的替代方案是:
class NilClass
def nil_or_empty?
true
end
end
class String
def nil_or_empty?
empty?
end
end
正如在 Rails (ActiveSupport) 有一个方便的 blank? 方法之前所说的,它是这样实现的:
class Object
def blank?
respond_to?(:empty?) ? empty? : !self
end
end
很容易添加到任何基于 ruby 的项目中。
这个解决方案的美妙之处在于它不仅适用于字符串而且适用于数组和其他类型。
变量.空白?会做的。如果字符串为空或字符串为 nil,则返回 true。
nil?
在布尔上下文中可以省略。通常,您可以使用它来复制 C# 代码:
return my_string.nil? || my_string.empty?
首先,请注意该方法:
正如 Jesse Ezel 所说:
Brad Abrams “该方法可能看起来很方便,但大多数时候我发现这种情况是由于试图掩盖更深层次的错误。你的代码应该坚持使用字符串的特定协议,并且你应该了解使用库代码和您正在使用的代码中的协议。NullOrEmpty 协议通常是一种快速修复(所以真正的问题仍然在其他地方,并且您有两个协议在使用中)或者它缺乏特定领域的专业知识实现新代码时的协议(同样,您应该真正知道您的返回值是什么)。”
如果您修补 String 类...请确保 NilClass has not been patch either!
class NilClass
def empty?; true; end
end
每个类都有一个 nil?
方法:
if a_variable.nil?
# the variable has a nil value
end
字符串具有 empty?
方法:
if a_string.empty?
# the string is empty
}
请记住,当字符串为空时,not 等于 nil
,因此请使用 empty?
方法检查字符串是否为空。
另一种选择是即时将 nil 转换为空结果:
(my_string||'').empty?
康拉德鲁道夫有正确的答案。
如果它真的让您感到困扰,请修改 String 类或将其添加到您选择的类/模块中。除非您有真正令人信服的理由,否则猴子修补核心对象确实不是一个好习惯。
class String
def self.nilorempty?(string)
string.nil? || string.empty?
end
end
然后你可以做String.nilorempty? mystring
检查纯 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
或更冗长的同类,因为应该为您不希望发生的事情保存异常。在这种情况下,虽然它可能是一个常见错误,但未定义的变量并不是真正的例外情况,因此应该相应地处理它。
你的旅费可能会改变。
如果您使用的是导轨,则可以使用 #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
您是否尝试过细化?
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?
在 Rails 中,您可以尝试 #blank?
。
警告:当字符串由空格组成时,它会给你肯定:
nil.blank? # ==> true
''.blank? # ==> true
' '.blank? # ==> true
'false'.blank? # ==> false
只是想指出来。也许它适合您的需求
UPD。为什么我的提要中出现老问题?很抱歉发布了墓志铭。
对于代码高尔夫球手:
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
不定期副业成功案例分享
strip
的变化可能非常低效。