【问题标题】:How to recreate the any? method in Ruby如何重新创建任何? Ruby中的方法
【发布时间】:2019-01-17 23:29:20
【问题描述】:

我正在尝试在 Ruby 中重新创建可枚举模块。我是什么?方法并且难以返回真假。取而代之的是,每个数组项都按 1 逐个返回。这是我的代码:

def my_any?
  return self.to enum unless block_given?
  self.each do |i|
    return true if i == yield(i)
  end
end

nums = [3,5,7,3,6,10,20,16]

puts nums.my_any?{|x|x==6}

任何想法我哪里出错了?

【问题讨论】:

    标签: ruby enumerable any


    【解决方案1】:

    您的代码存在三个问题:在不使用块的情况下调用此方法时,您应该返回一个枚举器,您应该检查yield 返回的内容,并且您应该在失败时显式返回false

    def my_any?
      return to_enum(:my_any?) unless block_given?
      each { |i| return true if yield(i) }
      false
    end
    
    nums = [3,5,7,3,6,10,20,16]
    
    puts nums.my_any? { |x| x == 6 }
    #⇒ true
    lazy = nums.my_any?
    lazy.each { |x| x == 6 }
    #⇒ true
    

    或者,我最好使用break

    def my_any?
      return to_enum(:my_any?) unless block_given?
    
      each { |i| break true if yield(i) } == true
    end
    

    【讨论】:

    • 我无法计算提问者想要重新创建 Enumerable 方法的次数,而忽略了回答以处理方法没有块并返回枚举数的情况。很高兴看到您处理了这个问题的非常重要的方面。
    • 哎呀! Enumerable#any? 只返回 truefalse,从不返回枚举数。奇怪的。我想有人可能希望写,例如,nums.any?.with_index { |x,i| x <= 6 && i >2 }
    • @CarySwoveland Enumerable#any? 比较年轻,现在的人都不那么挑剔了:)
    【解决方案2】:

    你有两个问题:

    1. 如果循环找不到匹配项,您将丢失return false。目前,当它匹配失败时,它会给出来自each 的返回值,这就是你所看到的。
    2. 目前总是失败,因为虽然你的return true if cond 构造是正确的,但any? 的条件不是i == yield(i):你有太多的比较。你只需要yield(i)

    to enum 位听起来也很奇怪,但这与您的问题无关。)

    将这些更改放入您的代码中:

    def my_any?
      # FIXME: return self.to enum unless block_given?
      self.each do |i|
        return true if yield i
      end
      false
    end
    

    【讨论】:

    • 不需要self
    • @Stefan 在我们卑微的生活中总是需要self :)
    猜你喜欢
    • 2015-12-19
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    • 2022-12-16
    • 2014-01-22
    • 2015-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多