Skip to content

Merge ToStr and the Default format #9806

@orenbenkiki

Description

@orenbenkiki

Now that the Default trait has been added for handling {} format, there are two ways to define how to convert an object to a string: foo.to_str() and format!("{}", foo); that is, the object needs to implement both ToStr and Default.

The proposal is to eliminate this duplication by eliminating ToStr and, instead, implementing to_str() by internally invoking the formatting function. This of course would be a major breaking change to existing code.

An alternative would be to provide a "default implementation" for the Default trait for anything implementing ToStr. This would be a backward-compatible change but would require extending the type system to allow for allowing default implementation of traits (if the type implements some other traits) with the ability to override the implementation for specific types.

Activity

alexcrichton

alexcrichton commented on Oct 11, 2013

@alexcrichton
Member

I think that this is tricky to do. Right now Default and ToStr are different semantically in the sense that I don't think that they can be directly merged. What I would be ok with, however, is to do the following:

  • Remove deriving(ToStr), change it to deriving(String) or maybe FmtString. This would add a deriving implementation of the String formatting trait (the :s qualifier
  • Migrate all types using ToStr to FmtString
  • impl<T: fmt::String> ToStr for T

That way nothing else really needs to implement ToStr, the to_str method is just a convenient way of saying format!("{:s}", t).

One of the main things which I would like to avoid is a deriving-like format of the Default trait because I don't think that there's fantastic way to do that. What do you think about these steps?

orenbenkiki

orenbenkiki commented on Oct 11, 2013

@orenbenkiki
Author

You are right, I was actually mixing issue #9807 into the proposal, and I shouldn't have - they are logically separate. Yes, indeed, if we ignore issue #9807, it makes more sense to merge String or FmtString or whatever it is called with ToStr instead of merging Default, and making to_str() invoke format! using {:s} instead of {}. Thanks for catching this.

huonw

huonw commented on Dec 7, 2013

@huonw
Member

I was talking to @alexcrichton on IRC, and he was ok with:

13:20:17 - acrichto: […] Default => Format, change ToStr to "impl<T: Format> ToStr for T"
13:20:24 - acrichto: I don't want to add to_str() to the formatting code just yet

This would still require removing the deriving(ToStr) mode.

1 remaining item

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @alexcrichton@orenbenkiki@huonw

        Issue actions

          Merge ToStr and the Default format · Issue #9806 · rust-lang/rust