在Ruby(而不是Rails)中,检查else if条件中的变量是否非空的最佳方法是什么?
elsif not variable.to_s.empty? # do something end
或
elsif !variable.to_s.empty? # do something end
elsif variable.to_s.length > 0 # do something end
bvpmtnay1#
string = "" unless string.to_s.strip.empty? # ... end
6qqygrtg2#
我刚刚发现''.empty?返回true但是' '.empty?返回false,甚至to_s.length对于' '也不是零。也许使用strip作为' '.strip.empty?更好
''.empty?
true
' '.empty?
false
to_s.length
' '
' '.strip.empty?
o7jaxewo3#
您可以使用其中一种
unless var.empty? #do sth end
unless var == "" #do sth end
或者用if和求反器!对所有这些进行求反。
if
!
lo8azlld4#
empty?方法的来源类似于以下内容:
empty?
def empty? return length == 0 end
所以你可以放心地使用
any_string.length != 0
无论如何,在else if中使用该代码有点冗长,我建议您在String类中定义present?方法。
String
present?
class String def present? !empty? end end
现在,您可以按照以下方式编写代码:
if some_condition # do something elsif variable.to_s.present? # do something else end
这样你就可以得到一个清晰的代码,而不需要使用negations或unless,它们很难读懂。当然,这里有一个问题,我从Rails中获取了present?的名称(和方法)。如果对象不为空,present?返回true,但是带有制表符或空格(白色字符)的字符串被认为是空的。因此,对于以下字符串,present?将返回true:
negations
unless
"".present? # => false " ".present? # => true "\t\n\r".present? # => true " blah ".present? # => true
这取决于你想要什么,很有可能你想要前3个字符串为true,后3个字符串为false。你可以使用@RamanSM方法和strip来避免空格
strip
class String def present? !strip.empty? end end
现在,present?对白色的字符串返回false
"".present? # => false " ".present? # => false "\t\n\r".present? # => false " blah ".present? # => true
注:考虑到String.present?存在于ActiveSupport库(随Rails提供)中,如果添加ActiveSupport或使用Rails,则应改用ActiveSupport实现。
String.present?
4xrmg8kj5#
如果你喜欢if胜过unless ...如果您知道您的变量将是一个字符串... if str[0]使用nil检查... if str && str[0] OR if str&.[](0)(我更喜欢后者,但对某些人来说可能看起来很奇怪,需要Ruby〉= 2.3)。还有......我会非常小心地调用#to_s,因为你可能会得到意想不到的结果。如果str是你没有预料到的......
if str[0]
if str && str[0]
if str&.[](0)
#to_s
str
str = false str.to_s[0] # => 'f' (i.e. truthy) str.to_s.empty? # => false str = nil str.to_s[0] # => nil (i.e. falsey) str.to_s.empty? # => true
我认为这个警告也适用于这里另一个答案中的#to_s的使用。例外可以是你的朋友。
ao218c7q6#
对于未定义的字符串(比如abc),我们应该检查abc.nil?,否则abc.blank?将抛出(NoMethodError)未定义的方法empty?,因为nil:NilClass错误
abc.nil?
6条答案
按热度按时间bvpmtnay1#
6qqygrtg2#
我刚刚发现
''.empty?
返回true
但是' '.empty?
返回false
,甚至to_s.length
对于' '
也不是零。也许使用strip作为
' '.strip.empty?
更好o7jaxewo3#
您可以使用其中一种
或
或者用
if
和求反器!
对所有这些进行求反。lo8azlld4#
empty?
方法的来源类似于以下内容:所以你可以放心地使用
无论如何,在else if中使用该代码有点冗长,我建议您在
String
类中定义present?
方法。现在,您可以按照以下方式编写代码:
这样你就可以得到一个清晰的代码,而不需要使用
negations
或unless
,它们很难读懂。当然,这里有一个问题,我从Rails中获取了
present?
的名称(和方法)。如果对象不为空,present?
返回true,但是带有制表符或空格(白色字符)的字符串被认为是空的。因此,对于以下字符串,present?
将返回true:这取决于你想要什么,很有可能你想要前3个字符串为true,后3个字符串为false。你可以使用@RamanSM方法和
strip
来避免空格现在,
present?
对白色的字符串返回false注:考虑到
String.present?
存在于ActiveSupport库(随Rails提供)中,如果添加ActiveSupport或使用Rails,则应改用ActiveSupport实现。4xrmg8kj5#
如果你喜欢
if
胜过unless
...如果您知道您的变量将是一个字符串...
if str[0]
使用nil检查...
if str && str[0]
ORif str&.[](0)
(我更喜欢后者,但对某些人来说可能看起来很奇怪,需要Ruby〉= 2.3)。还有......我会非常小心地调用
#to_s
,因为你可能会得到意想不到的结果。如果str
是你没有预料到的......我认为这个警告也适用于这里另一个答案中的
#to_s
的使用。例外可以是你的朋友。ao218c7q6#
对于未定义的字符串(比如abc),我们应该检查
abc.nil?
,否则abc.blank?将抛出(NoMethodError)未定义的方法empty?
,因为nil:NilClass错误