[ruby-core:80477] [Ruby trunk Bug#13312] String#casecmp raises TypeError instead of returning nil

From: morita.shingo@...
Date: 2017-03-29 10:11:32 UTC
List: ruby-core #80477
Issue #13312 has been updated by shingo (shingo morita).

File patch.diff added

I agree this is not expecting behavior. then I made a patch for this.
Added test codes below.

```diff
diff --git a/test/ruby/test_string.rb b/test/ruby/test_string.rb
index 7dbf27e..96b37fd 100644
--- a/test/ruby/test_string.rb
+++ b/test/ruby/test_string.rb
@@ -2318,6 +2318,8 @@ def test_compare_different_encoding_string
 
   def test_casecmp
     assert_equal(1, "\u3042B".casecmp("\u3042a"))
+    assert_nil("Foo".casecmp(:Foo))
+    assert_nil("1".casecmp(1))
   end
 
   def test_casecmp?
@@ -2325,6 +2327,8 @@ def test_casecmp?
     assert_equal(false, 'FoO'.casecmp?('BaR'))
     assert_equal(false, 'baR'.casecmp?('FoO'))
     assert_equal(true, 'äöü'.casecmp?('ÄÖÜ'))
+    assert_nil("Foo".casecmp?(:Foo))
+    assert_nil("1".casecmp?(1))
   end
``` 


----------------------------------------
Bug #13312: String#casecmp raises TypeError instead of returning nil
https://bugs.ruby-lang.org/issues/13312#change-63972

* Author: stomar (Marcus Stollsteimer)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
* ruby -v: r57964
* Backport: 2.2: UNKNOWN, 2.3: UNKNOWN, 2.4: UNKNOWN
----------------------------------------
String#casecmp and String#casecmp? behave differently from other comparison methods: for incomparable values they raise a TypeError, while Symbol#{casecmp,casecmp?} and the #<=> methods (also for other classes) return `nil`:

``` ruby
"abc" <=> 1       # => nil
"abc".casecmp 1   # TypeError: no implicit conversion of Integer into String
"abc".casecmp? 1  # TypeError: no implicit conversion of Integer into String

:abc <=> 1        # => nil
:abc.casecmp 1    # => nil
:abc.casecmp? 1   # => nil

1  <=> Time.now   # => nil
[] <=> :foo       # => nil
```

This is surprising, since String#casecmp is essentially a case-insensitive version of String#<=>, which seems to imply that they should behave in a similar way. Also, the different behavior for String and Symbol might be an indication that this is a bug and not intentional.

---Files--------------------------------
patch.diff (2.5 KB)


-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>

In This Thread

Prev Next