Ruby 做题:Bag#every?

chenge · April 25, 2014 · Last by chenge replied at April 25, 2014 · 2598 hits

大伙儿很有兴趣,再来一题,6yku。

We have an awesome, custom collection class, Bag, which already has implemented an #each for traversing its items and #count for counting the items. New requirements come in for the project to check arbitrary conditions regarding data inside of a Bag.

We were just about to break out the trusty old #each hammer, when we realize there might be an better/easier/cleaner way. Spotting an abstraction waiting to happen, we decide implement a new method, #every?, to make sure that every item in a Bag matches the condition.

The #every? method needs to receive a block to run some test against every item. If every test passes, it returns true. If any of the tests fail, it returns false. Empty bags should pass all tests.

It also has a shorthand variation for our lazy friends. If you do not pass a block to #every, it tests the truthiness of the items themselves.

class Bag

  # already implemented:
  #   #each
  #   #count


Examples:

bag = Bag.new(:surefire, :tests)
bag.every? { true } # => true
bag.every? { false } # => false

bag = Bag.new(1,2,3,4)
bag.every? { |num| num > 0 } # => true
bag.every? { |num| num.odd? } # => false

bag = Bag.new(:code, :wars)
bag.every? # => true

bag = Bag.new(:cat, :+, :roomba, nil, :profit!)
bag.every? # => false

反正已经出过一次洋相了不介意再出一次...

def every?
  self.each do |item|
    if block_given?
      return false unless yield item
    else
      return false unless item
    end
  end
  true
end

#1 楼 @blacktulip 谢谢,学习了。

def every?
    each do |item|
      return false unless block_given? ? yield(item) : item
    end

    return true
  end

这个思路类似

直接贴题目也就罢了,要每次都我来给你格式化帖子嘛?

#3 楼 @lgn21st 单行代码不用格式吧

You need to Sign in before reply, if you don't have an account, please Sign up first.