【问题标题】:First element of an array with condition有条件的数组的第一个元素
【发布时间】:2012-11-12 07:31:18
【问题描述】:

有没有比这更短的方法来找到数组中满足某些条件的第一个元素:

my_array[ my_array.index {|x| x.some_test} ]

【问题讨论】:

    标签: ruby arrays


    【解决方案1】:

    试试这个:

    my_array.find{|x| x.some_test }
    

    或者这里有一个捷径(感谢@LarsHaugseth 提醒)

    my_array.find(&:some_test)
    

    【讨论】:

    • 可简写为my_array.find(&:some_test)
    【解决方案2】:

    我觉得听起来很混乱。正如我所期望的那样,这样的请求会收到多个对象。

    我更喜欢使用detect 来获得不同的结果。

    还有select,感谢您找到所有这些。

    这里是 ruby​​ 文档告诉他们的:

    detect(ifnone = nil) {| obj | block } → obj or nil click to toggle source 
    find(ifnone = nil) {| obj | block } → obj or nil 
    detect(ifnone = nil) → an_enumerator 
    find(ifnone = nil) → an_enumerator
    

    将枚举中的每个条目传递给阻塞。返回第一个不为假的块。如果没有对象匹配,则调用 ifnone 并在指定时返回其结果,否则返回 nil。

    find_all {| obj | block } → array click to toggle source
    select {| obj | block } → array
    find_all → an_enumerator
    select → an_enumerator
    

    返回一个数组,其中包含所有块不为假的枚举元素

    【讨论】:

    • 查找/检测、映射/收集、减少/注入 - 每个人都有一种方法 :)
    • 对我来说,detect 听起来根本不是一个正确的方法。 find 至少可以找到并返回一些东西。 detect 做了什么并返回 - 如果不咨询文档,我不知道。
    • 尽管如此,ruby 社区仍然大多选择find。一个很好的理由让你切换。
    • detect 在处理活动记录对象等时很有用(其中find 被覆盖并执行数据库查询)
    猜你喜欢
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 2015-03-25
    相关资源
    最近更新 更多