有没有比下面更好的方法来检查一个字符串是否为 nil 或者在 Ruby 中长度为0?
if !my_string || my_string.length == 0 return true else return false end
在 C # 里有个便利的
string.IsNullOrEmpty(myString)
Ruby 有类似的吗?
每个类都有一个 nil?方法:
nil?
if a_variable.nil? # the variable has a nil value end
字符串具有 empty?方法:
empty?
if a_string.empty? # the string is empty }
请记住,字符串在为空时 没有等于 nil,因此使用 empty?方法检查字符串是否为空。
nil
在布尔上下文中可以省略 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
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 协议是一个典型的快速解决方案(所以真正的问题还在其他地方,你有两个正在使用的协议) ,或者在实现新代码时缺乏特定协议的专业知识(再次强调,你应该真正知道你的返回值是什么)。”
Brad Abrams
“这种方法可能看起来很方便,但大多数时候,我发现这种情况是因为试图掩盖更深层次的错误而出现的。
您的代码应该遵守关于字符串使用的特定协议,并且您应该理解协议在库代码和正在使用的代码中的使用。
NullOrEmpty 协议是一个典型的快速解决方案(所以真正的问题还在其他地方,你有两个正在使用的协议) ,或者在实现新代码时缺乏特定协议的专业知识(再次强调,你应该真正知道你的返回值是什么)。”
如果你修补字符串类... 确保 NilClass 也没有被修补!
class NilClass def empty?; true; end end
如果您愿意要求 ActiveSupport,只需使用 #blank?方法,该方法是为 NilClass 和 String 定义的。
#blank?
正如之前所说的,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 == ""
这里有一些很好的答案,但是您不需要 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?
#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?检查长度是零还是零
!present?
!(nil.present?) # ==> true !(''.present?) # ==> true !(' '.present?) # ==> true !([].present?) # ==> true !(false.present?) # ==> true