加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Ruby中是否有一个与find相反的方法?

发布时间:2020-12-16 21:29:04 所属栏目:百科 来源:网络整理
导读:a,b,c = 0,1,2[a,c].find(:zero?) # = 0 是否有任何方法可以找到块返回false的第一个元素? [a,c].the_method(:zero?) # = 1 换句话说,它的行为方式与: [a,c].reject(:zero?).first 解决方法 有 is not,但你可以创建一个干净的方式: a = [0,2,3]module Enu
a,b,c = 0,1,2
[a,c].find(&:zero?) # => 0

是否有任何方法可以找到块返回false的第一个元素?

[a,c].the_method(&:zero?) # => 1

换句话说,它的行为方式与:

[a,c].reject(&:zero?).first

解决方法

有 is not,但你可以创建一个干净的方式:
a = [0,2,3]

module Enumerable
  def first_not(&block)
    find{ |x| !block[x] }
  end
end

p a.first_not(&:zero?)
#=> 2

……或者是非常有趣的黑客方式:

class Proc
  def !
    proc{ |o,*a| !self[o,*a] }
  end
end

p a.find(&!(:zero?.to_proc))
#=> 2

……或者简洁但非常危险的方式:

class Symbol
  def !
    proc{ |o,*a| !o.send(self,*a) }
  end
end

p a.find(&!:zero?)
#=> 2

但我主张只是跳过棘手的Symbol#to_proc用法并说出你想要的东西:

p a.find{ |i| !i.zero? }
#=> 2

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读