Skip to content

Ergonomics: &String does not implement PartialEq<str> #44695

Closed
@djc

Description

@djc

Start with this:

fn cmp_prefix() -> bool {
    let owned = "foo".to_owned();
    let string_ref = &owned;
    let partial = "foobar";
    string_ref == partial[..3]
}

It doesn't compile: "the trait bound &String: PartialEq<str> is not satisfied".

Let's Google this, first hit is StackOverflow, first/accepted answer talks about .as_ref(), try that. string_ref.as_ref() == &partial[..3] results in "the trait bound &_: PartialEq<str> is not satisfied" [oh, how I hate these underscores in errors].

At this point I try adding * to the LHS or & to the RHS. The latter results in "type annotations required: cannot resolve String: AsRef<_>" [huh?].

Here's actually everything I tried (from my actual code instead of simple example):

meta_subj == db_subj[..998]
&meta_subj == &db_subj[..998]
meta_subj.as_ref() == &db_subj[..998] // I think this was before Googling, even
meta_subj.as_ref() == db_subj[..998]
meta_subj.as_ref::<&str>() == &db_subj[..998] // WTF is this thing with not resolving String: AsRef?
&meta_subj.as_ref() == db_subj[..998]
*meta_subj.as_ref() == db_subj[..998]

At this point I'm pretty much out of ideas other than brute-forcing with some to_string(). I don't really consider myself a beginner at this point, having successfully written a few thousand lines of code over the past 15 months, so here's where I have some empathy for those saying Rust's learning curve is just too steep.

I went and read some more on SO and found this, which actually seems to work (meta_subj as &str) == &db_subj[..998]. The reason I would not have come up with this is that generally the compiler seems to be able to coerce &T where T: String to &str, so I find it hard to come up with a reason it cannot do so in this case.

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-diagnosticsArea: Messages for errors, warnings, and lintsA-trait-systemArea: Trait systemC-bugCategory: This is a bug.D-confusingDiagnostics: Confusing error or lint that should be reworked.D-newcomer-roadblockDiagnostics: Confusing error or lint; hard to understand for new users.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.T-langRelevant to the language team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions