enumerable/predicates_and_slices_no_parens.rb

tests/_examples/enumerable/predicates_and_slices_no_parens.rb in the metorex repository.

# Enumerable's predicates, batching, and counting, over a class that supplies
# only each.
class Numerous
  include Enumerable

  def initialize *list
    @list = list
  end

  def each
    @list.each { |value| yield value }
  end

  def size
    @list.size
  end
end

numbers = Numerous.new 1, 2, 3, 4, 5

p numbers.all? { |value| value > 0 }
p numbers.any? { |value| value > 4 }
p numbers.none? { |value| value > 5 }
p numbers.one? { |value| value == 3 }

# A pattern argument is matched with ===, and it stands in for a block.
p numbers.all? Integer
p numbers.any? String
p numbers.none? String
p numbers.count 3
p numbers.count { |value| value.odd? }
p numbers.find_index 4

# nil, true, and false answer to their own classes.
p [nil, false].any? NilClass
p [1, nil].none? TrueClass

p numbers.each_slice(2).to_a
p numbers.each_cons(2).to_a
p numbers.each_slice(2).size
p numbers.each_cons(2).size

p numbers.first
p numbers.first 2
p numbers.take_while { |value| value < 3 }
p numbers.drop 2
p numbers.drop_while { |value| value < 3 }

# A count is coerced through to_int, and a negative one is an error.
class Two
  def to_int
    2
  end
end
p numbers.take Two.new
begin
  numbers.take -1
rescue ArgumentError => error
  p error.message
end
begin
  numbers.drop "two"
rescue TypeError => error
  p error.message
end

p Numerous.new("a", "b", "a").tally
p Numerous.new("a", "b", "a").tally({ "a" => 1 })

p numbers.zip [10, 20, 30, 40, 50]
p numbers.flat_map { |value| [value, -value] }
p numbers.sum
p Numerous.new(2.78, 5.0, 2.5, 4.44, 3.89, 3.89, 4.44, 7.78, 5.0, 2.78, 5.0, 2.5).sum

# break in a block leaves the Enumerable method with the value it carried.
counted = Numerous.new(4, 3, 2, 1)
p(counted.take_while { |value| break :stopped if value == 3; true })

# An optional parameter takes its default even when a splat follows it.
def labelled name = :unnamed, *rest
  [name, rest]
end
p labelled()
p labelled :given, 1, 2

Output:

true
true
true
true
true
false
true
1
3
3
true
true
[[1, 2], [3, 4], [5]]
[[1, 2], [2, 3], [3, 4], [4, 5]]
3
4
1
[1, 2]
[1, 2]
[3, 4, 5]
[3, 4, 5]
[1, 2]
"attempt to take negative size"
"no implicit conversion into Integer"
{"a" => 2, "b" => 1}
{"a" => 3, "b" => 1}
[[1, 10], [2, 20], [3, 30], [4, 40], [5, 50]]
[1, -1, 2, -2, 3, -3, 4, -4, 5, -5]
15
50.0
:stopped
[:unnamed, []]
[:given, [1, 2]]