Project

General

Profile

Actions

Feature #6367

open

#same? for Enumerable

Added by prijutme4ty (Ilya Vorontsov) almost 9 years ago. Updated over 3 years ago.

Status:
Feedback
Priority:
Normal
Target version:
-
[ruby-core:44648]

Description

I realised that I frequently test if all objects in enumerable have the same feature. For example if all words have the same length (but not defined before). So I found particulary useful method Enumerable#same_by? that test this behaviour. I think it can be simply rewritten in C and included to Enumerable core methods.
Simple ruby implementation can be written just in a pair of lines (tests included):

module Enumerable
def same?(&block)
return true if empty?
if block_given?
first_result = yield(first)
all?{|el| first_result == yield(el)}
else
first_result = first
all?{|el| first_result == el}
end
end
end

require 'test/unit'
class TestEnumerableSame < Test::Unit::TestCase
def test_same
assert_equal(true, [1,3,9,7].same?(&:even?))
assert_equal(true, [4,8,2,2].same?(&:even?))
assert_equal(false, [1,8,3,2].same?(&:even?))

assert_equal(true, %w{cat dog rat}.same?(&:length))
assert_equal(false, %w{cat dog rabbit}.same?(&:length))

assert_equal(true, %w{cat cat cat}.same?)
assert_equal(false, %w{cat dog rat}.same?)

assert_equal(true, [].same?(&:length))
assert_equal(true, [].same?)

end
end

Actions

Also available in: Atom PDF