From: sawadatsuyoshi@... Date: 2018-10-18T06:12:47+00:00 Subject: [ruby-core:89455] [Ruby trunk Feature#15231] Remove `Object#=~` Issue #15231 has been updated by sawa (Tsuyoshi Sawada). I agree. At the same time, the `String=~` behaviour: >str =~ obj ��� integer or nil click to toggle source Match���If obj is a Regexp, use it as a pattern to match against str,and returns the position the match starts, or nil if there is no match. Otherwise, invokes obj.=~, passing str as an argument. The default =~ in Object returns nil. (from https://ruby-doc.org/core-2.4.0/String.html#method-i-3D~) should be changed to raise a `TypeError` when `obj` is not a `Regexp`, on a par with `Regexp#=~` given a non-`String` argument. Afterall, the following unnatural asymmetry in the current behaviour should be resolved: ```ruby // =~ Object.new # >> TypeError: no implicit conversion of Object into String "" =~ Object.new # => nil ``` ---------------------------------------- Feature #15231: Remove `Object#=~` https://bugs.ruby-lang.org/issues/15231#change-74495 * Author: mame (Yusuke Endoh) * Status: Open * Priority: Normal * Assignee: * Target version: ---------------------------------------- `Object#=~` receives (and just discards) an argument, and always returns nil. What purpose is this method for? The following behavior that `Object#=~` caused was confusing to me. ```RUBY ["foo"] =~ /foo/ #=> nil ``` More precisely: the actual example that I encountered was to parse coverage data from output of coverage measurement tool by using `Open3.capture2`: ```RUBY out = Open3.capture2("gcov", ...) # BUG: `out, =` was intended if out =~ /lines\.*: *(\d+\.\d+)%/ ... end ``` Obviously, I forgot a comma to receive the return value of `Open3.capture2`. The method returns a two-element array, and `out =~` calls `Object#=~`, which hid the bug. (Worse, I took several tens of minutes to debug it because I first thought that this is a bug of regexp, and spent tweaking the regexp.) I guess `Object#=~` was intended for general pattern matching, but presently the role was taken over by `Object#===`. So. How about removing `Object#=~`? Concerns: * @usa said `NilClass#=~` should be newly introduced because of: `if gets =~ /re/` * `Object#!~` is difficult to remove: some classes define only `#=~`, and expect `Object#!~` to delegate to `#=~`. -- https://bugs.ruby-lang.org/ Unsubscribe: