我知道我可以这样做
unless [1].empty?
不过我想知道是否有一种方法?
我知道我可以这样做
unless [1].empty?
不过我想知道是否有一种方法?
除了像davidrac提到的#any?
,使用ActiveSupport还有一个更类似于其他语言中的真值测试的方法#present?。对于 nil
, false
, ''
, {}
, []
等返回 false;对于其他所有情况都返回true(包括 0,这很有趣)。
any?
比起![].empty?
会慢一些因为any?
需要检查是否存在nil元素。虽然present?
和blank?
很好用,但它们也较慢,因为它们必须检查元素是否respond_to?(:empty)
。没有真正的empty?
的反义词。 - Schneems[nil].any?
=> false
[nil].any? {|something| true}
=> true
[].any? {|something| true}
=> false
[false, false].any? {|something| true}
=> true
[nil, 'g'].any? {|something| true}
=> true
我知道的没有一种单一的方法可以在Ruby中实现这一点。关键词是“单一”:
[5].size.positive? => true
[5].size.nonzero? => 1
[].size.positive? => false
[].size.nonzero? => nil
使用安全导航操作符后,这两种方法变得更加有用,因为nil返回假值,意味着负面的方法(如#empty?)会有些问题:
# nil considered 'not empty' isn't usually what you want
not_empty = proc{|obj| !obj&.empty? }
not_empty.call nil => true
not_empty.call [ ] => false
not_empty.call [5] => true
# gives different 3 answers for the 3 cases
# gives truthy/falsy values you'd probably expect
positive_size = proc{|obj| obj&.size&.positive? }
positive_size.call nil => nil
positive_size.call [ ] => false
positive_size.call [5] => true
# gives truthy/falsy values you'd probably expect
nonzero_size = proc{|obj| obj&.size&.nonzero? }
nonzero_size.call nil => nil
nonzero_size.call [ ] => nil
nonzero_size.call [5] => 1
检查数组中是否存在元素:
.empty? (空?)
.present?(存在?)
如果 a={}
a.any? .nil?
将会返回 false。
检查字段是否具有非 nil 值:
.present?
.nil?
.any?
present?
是 Rails / ActiveSupport 中的方法,而不是核心 Ruby 中的方法。 - Paul Annesley