Project

General

Profile

Actions

Feature #8229

open

extend Hash.include?

Added by eike.rb (Eike Dierks) over 11 years ago. Updated 8 months ago.

Status:
Assigned
Target version:
-
[ruby-core:54067]

Description

I'd like to suggest to extend the Hash.include? method.

Currently Hash.include? can only be used to ask for a key,
I believe it should be extended to ask for a (key value) pair.

I believe this extension can be done without breaking prior api.

I suggest to extend the signature of Hash.include?
to Hash.include?(key, value)

That message should return true,
if the receiving object does have an object at key which is equal to value.

It would be a simple replacement for:
h.include?(key) && h[key] == value

But I do not want to stop there.
I'm heading for h.include_all?(other_hash)
and h.include_any?(other_hash)

and it would be valuable to have h.intersect(other_hash) etc

I believe these to be useful primitives when working with hashes.

I'd like to have the api of the Set class available for the Hash class as well,
but there working on key/value matching.

Obviously any change to such the substantial class as the Hash class
needs a lot of thought for compatibility.

But I believe this can be done without breaking any prior code,
and it could add a lot of new out of the box functionality.

This probably needs some more thought.
We might come up with some dsl like thing like
h.includes.any? or h.includes.all? or h.includes.none?
to be used cross all collection classes.

Someone must be in charge for the Hash class,
my 2p


Files

0001-hash.c-Hash-include-improve.patch (5.37 KB) 0001-hash.c-Hash-include-improve.patch nobu (Nobuyoshi Nakada), 04/09/2013 04:37 PM

Updated by naruse (Yui NARUSE) over 11 years ago

  • Description updated (diff)
  • Category changed from misc to core
  • Assignee changed from nobu (Nobuyoshi Nakada) to matz (Yukihiro Matsumoto)

Updated by marcandre (Marc-Andre Lafortune) over 11 years ago

Could you elaborate on why this is needed and in which cases one would need this?

Moreover, I would not write h.include?(key) && h[key] == value. In most cases h[key] == value is sufficient (unless value can be nil or there's a default proc). Otherwise one can write h.fetch(key, DIFFERENT) == value, where DIFFERENT is an value different from all possible values of the hash, like Object.new).

Updated by headius (Charles Nutter) over 11 years ago

As a feature that affects all Ruby implementations, this should probably move to CommonRuby: https://bugs.ruby-lang.org/projects/common-ruby

Updated by fuadksd (Fuad Saud) over 11 years ago

I think this would be more interesting if in the form:

h = { a: 'b', c: { d: 'e' } }

h.include?({c: { d: 'e' } }) # => true

It would accept a hash and check whether h includes that hash.

Actions #6

Updated by naruse (Yui NARUSE) almost 4 years ago

  • Target version deleted (3.0)
Actions #7

Updated by hsbt (Hiroshi SHIBATA) 8 months ago

  • Status changed from Open to Assigned
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0