[swift-evolution] Change Request: Make myString.hasPrefix("") and myString.hasSuffix("") return true
Tony Allevato
allevato at google.com
Tue Jul 19 11:22:38 CDT 2016
On Tue, Jul 19, 2016 at 9:17 AM Ted F.A. van Gaalen via swift-evolution <
swift-evolution at swift.org> wrote:
> ok, Dave
>
>
>
> to me - strings being collections -, all I see is:
> trying to find an empty string within another string: There are (at least)
> two ways of treating this:
>
> 1. return “false” seems to me logically correct, because
> there is never an empty string in another string, and an empty string
> cannot contain another empty string, right?
> This has worked very conveniently for NSString in ObjC for more than
> 20 years, why change it?
> Do you know of cases that were problematic with this convention?
>
Formally-ish speaking, the empty string is a zero-length string contained
at every valid index "i" between [startIndex, endIndex].
A very casual way of showing this (which I won't call a proof, because it's
not that formal) is that "ab" is the same string as "a" + "" + "b", so ""
is a substring of "ab". Likewise, "a" == "" + "a", therefore "a" has "" has
a prefix, and the same argument can be made for the suffix.
Also, "" + "" == "", so you have "" has the prefix and suffix of "".
There's simply no reason to disallow this behavior. I've actually gotten
bitten by the current wrong behavior in NSString in production before and
had to write a special case around it.
>
> 2 throw a runtime error when trying to do this:
> str.hasPrefix(“”) // also for hasSuffix, str.contains etc.
>
> some in-line questions below.
>
> Kind Regards
>
> Ted
>
>
> On 19.07.2016, at 16:31, Dave Abrahams <dabrahams at apple.com> wrote:
> >
> >
> > on Tue Jul 19 2016, "Ted F.A. van Gaalen" <tedvgiosdev-AT-gmail.com>
> wrote:
> >
> >> Hi Dave
> >>
> >> “true” ? am I going nuts ? :o)
> >>
> >> var str = "Hello, playground"
> >>
> >> print( str.hasPrefix("”)) // case 1 : false
> >>
> >> print( str.hasSuffix("”)) // case 2 : false
> >>
> >> print("" == “a” ) // case 3 : false
> >>
> >> Currently, all cases above evaluate to “false”
> >> i think that is correct,
> >
> > I don't know what to tell you. It may seem intuitively correct to you,
> > but others in the thread have laid out the reasons why it is not
> > mathematically correct behavior.
> Where? I couldn’t find any.
> > One other way of rephrasing it: to get
> > `false` for str.hasPrefix(""), you actually need special-case code in
> > hasPrefix to check for the empty string,
> again, maybe it should throw a run-time error instead.
>
>
> > and the caller may well also
> > need special-case code to handle the fact that the result is not
> > mathematically consistent with other cases on the continuum.
> In this context as “continuum” :
> are you referring to “sets” or “collections” here?
> what other cases?
>
> > Doing
> > things that way doesn't work in practice for real programs.
> please explain thank you, because I see no problems at
> all with the current NSString-like evaluation…
> I’d put an s.isEmpty() in front of it.
> >
> >> because:
> >>
> >> How can an empty string be a prefix or suffix value?
> >> as there is no empty string present in a non-empty string.
> >>
> >> Note that if case 1 and case 2 would evaluate to “true”,
> >> it would conflict with case 3.
> >>
> >> Can’t imagine that case 3 should in future also result in “true”
> >>
> >> ??
> >>
> >> -----
> >>
> >> Also I hope that changes to String functionality
> >> for Swift 4 are not backward breaking changes
> >> even the more for string handling, because Strings
> >> are heavily used in most apps.
> >>
> >> I am firmly convinced that all future releases of Swift
> >> should compile Swift 3 and higher source files without
> >> any changes 100 % flawlessly! This prevents early diminishing
> >> of Swift’s popularity, especially with those building large
> >> codebases using Swift.
> >>
> >> I’ve started a thread about this a week ago,
> >> however no one found this important enough to
> >> share their opinions with me yet, or were too busy with
> >> other subjects to do so.
> >>
> >> Increasingly I have dreams, me
> >> programming complete apps in Smalltalk
> >> and then automagically generate
> >> an macOS, tvOS or iOS runtime app of it.
> >>
> >> (I have also dreams of this world becoming
> >> a nice and peaceful placebut that is
> >> beyond the context of this forum)
> >>
> >> Kind Regards
> >> TedvG
> >>
> >> www.speyer.de
> >>
> >>> on Mon Jul 18 2016, Kevin Nattinger <swift-evolution at swift.org
> <mailto:swift-evolution at swift.org>> wrote:
> >>>
> >>>> I agree, true is definitely the expected behavior. In particular, it
> >>>> seems absurd to me that `a.hasPrefix(b)` and `a.hasSuffix(b)` could be
> >>>> false when `a == b` is true.
> >>>
> >>> I expect to be reworking Strings for Swift 4, and this is one of the
> >>> many things we plan to address.
> >>>
> >>> --
> >>> Dave
> >>>
> >>>
> >>
> >
> > --
> > Dave
>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160719/438fbeb8/attachment-0001.html>
More information about the swift-evolution
mailing list