Project

General

Profile

Actions

Feature #8053

closed

Make coercion if #=== operator doesn't know what to do

Added by prijutme4ty (Ilya Vorontsov) about 11 years ago. Updated almost 11 years ago.

Status:
Rejected
Target version:
[ruby-core:53245]

Description

Related to http://bugs.ruby-lang.org/issues/7604
It'd be fine if === will do coerce when it doesn't know what to do. In ticket above I gave use-case for case-statement which needs that any ruby object could be coerced to a "pattern".
For example

case arr.end_with?
when ['several', 'words'] then puts 'arr have last two elements: several, words'
when ['word'] then puts 'arr have last element: word'
else puts 'cannot understand'
end

It'd be possible if Array#===(predicate) will simply use usual coerce call: predicate.coerce(arr) -- Predicate#coerce is a good point to understand behavior of such matching.

Another example:

class FalseYielder
def ===(other)
false
end
end
class MyString
def initalize(string); @string = string; end
attr_reader :string
def coerce(other)
if other.is_a? Regexp
[other, self.string]
else
[FalseYielder.new, self]
end
end
end

case MyString.new('abcpatdef')
when /pat/ then 'it works'
end

Here we shouldn't monkeypatch Regexp class and it's good, we can make an error only in our own class MyString.

Updated by zzak (zzak _) almost 11 years ago

  • Category set to core
  • Status changed from Open to Assigned
  • Assignee set to matz (Yukihiro Matsumoto)
  • Target version set to 2.6

Updated by matz (Yukihiro Matsumoto) almost 11 years ago

  • Status changed from Assigned to Rejected

Objects except for numbers does not have coerce protocol. I am not sure how far OP wants to dig in.
Design and implement coerce protocol? Or special kind of coercion for case statement?
In that sense, this proposal is half-baked.

Re-submit if you come up with concrete behavior definition, e.g. what "doesn't know" mean.

Matz.

Updated by Anonymous almost 11 years ago

Sorry, Ilya, I already did some thinking, but didn't finish that flex-coerce yet.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0