From: "mame (Yusuke Endoh) via ruby-core" Date: 2025-06-05T21:37:16+00:00 Subject: [ruby-core:122469] [Ruby Feature#21346] Introduce `String#ensure_suffix` Issue #21346 has been updated by mame (Yusuke Endoh). Let me record the background of the discussion. During the dev meeting, we considered the following use case: ```ruby path.ends_with?(".rb") ? path : "#{path}.rb" ``` When rewriting this as `path.ensure_suffix(".rb")`, the behavior of appending just `"b"` when path is `"foo.r"` to make it `"foo.rb"` is somewhat unexpected. This is the rationale behind the idea that `"Hello".ensure_suffix("o!")` should return `"Helloo!"`. --- That said, on a personal note, I think the method name `ensure_suffix` is indeed confusing. As @ufuk pointed out, and as @akr also mentioned in the meeting, it sounds like a method that makes the minimal necessary addition. I agree with you. The code snippet `path.ends_with?(".rb") ? path : "#{path}.rb"` isn't particularly long, and its meaning is quite clear, so maybe we don't need this method at all. ---------------------------------------- Feature #21346: Introduce `String#ensure_suffix` https://bugs.ruby-lang.org/issues/21346#change-113657 * Author: matheusrich (Matheus Richard) * Status: Open ---------------------------------------- ## Problem Ensuring a string has a specific suffix or prefix is a common operation in many applications. Bundler itself uses it: https://github.com/rubygems/rubygems/blob/d409ec8b5fc647fabe30e37e17cd1ea857634f6b/bundler/lib/bundler/uri_normalizer.rb#L17 Here are [GitHub search](https://github.com/search) queries that might find this pattern in other places: 1. for Ruby: `/end(?:s)?_with\?\(['"].*['"]\) \?/ lang:ruby -is:fork` 1. for Crystal (a language very similar to Ruby): `/ends_with\?\(['"].*['"]\) \?/ lang:crystal -is:fork` ## Suggested solution I believe Ruby would benefit from having a first-class method for this purpose. I suggest the `String#ensure_suffix` and `String#ensure_prefix` methods. I think these names are intuitive enough (here are 2 examples of people using `ensure` for this purpose ([1](https://github.com/boltops-tools/ufo/blob/796104fdb89163d09a58fad42add697923c18294/lib/ufo/cfn/stack/builder/resources/dns.rb#L76), [2](https://github.com/mumuki/mumuki-domain/blob/6194089d82b1a0c8805ecba98e006deb1694dc8e/lib/mumuki/domain/extensions/string.rb#L6))). I've gone ahead and implemented `String#ensure_suffix` in a [pull request](https://github.com/ruby/ruby/pull/13366) but the suggested behavior is this: ```rb "Hell".ensure_suffix("o!") # => "Hello!" "Hello!".ensure_suffix("o!") # => "Hello!" s = "Hello!" s.ensure_suffix("!").equal?(s) # => true # returns same object if already suffixed ``` -- https://bugs.ruby-lang.org/ ______________________________________________ ruby-core mailing list -- ruby-core@ml.ruby-lang.org To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/