检查字符串是否为空的Ruby方法?

2skhul33  于 2023-01-12  发布在  Ruby
关注(0)|答案(6)|浏览(270)

在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
bvpmtnay

bvpmtnay1#

string = ""

unless string.to_s.strip.empty?
  # ...
end
6qqygrtg

6qqygrtg2#

我刚刚发现''.empty?返回true但是' '.empty?返回false,甚至to_s.length对于' '也不是零。
也许使用strip作为' '.strip.empty?更好

o7jaxewo

o7jaxewo3#

您可以使用其中一种

unless var.empty?
  #do sth
end

unless var == ""
  #do sth
end

或者用if和求反器!对所有这些进行求反。

lo8azlld

lo8azlld4#

empty?方法的来源类似于以下内容:

def empty?
    return length == 0      
end

所以你可以放心地使用

any_string.length != 0

无论如何,在else if中使用该代码有点冗长,我建议您在String类中定义present?方法。

class String
    def present?
        !empty?
    end
end

现在,您可以按照以下方式编写代码:

if some_condition
  # do something
elsif variable.to_s.present?
  # do something else
end

这样你就可以得到一个清晰的代码,而不需要使用negationsunless,它们很难读懂。
当然,这里有一个问题,我从Rails中获取了present?的名称(和方法)。如果对象不为空,present?返回true,但是带有制表符或空格(白色字符)的字符串被认为是空的。因此,对于以下字符串,present?将返回true:

"".present?       # => false
"   ".present?    # => true
"\t\n\r".present? # => true
" blah ".present? # => true

这取决于你想要什么,很有可能你想要前3个字符串为true,后3个字符串为false。你可以使用@RamanSM方法和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实现。

4xrmg8kj

4xrmg8kj5#

如果你喜欢if胜过unless ...
如果您知道您的变量将是一个字符串... if str[0]
使用nil检查... if str && str[0] OR if str&.[](0)(我更喜欢后者,但对某些人来说可能看起来很奇怪,需要Ruby〉= 2.3)。
还有......我会非常小心地调用#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的使用。例外可以是你的朋友。

ao218c7q

ao218c7q6#

对于未定义的字符串(比如abc),我们应该检查abc.nil?,否则abc.blank?将抛出(NoMethodError)未定义的方法empty?,因为nil:NilClass错误

相关问题