- Start Date: 2014-11-02
- RFC PR: rust-lang/rfcs#430
- Rust Issue: rust-lang/rust#19091
Summary
This conventions RFC tweaks and finalizes a few long-running de facto
conventions, including capitalization/underscores, and the role of the unwrap method.
See this RFC for a competing proposal for unwrap.
Motivation
This is part of the ongoing conventions formalization process. The conventions described here have been loosely followed for a long time, but this RFC seeks to nail down a few final details and make them official.
Detailed design
General naming conventions
In general, Rust tends to use UpperCamelCase for "type-level" constructs
(types and traits) and snake_case for "value-level" constructs. More
precisely, the proposed (and mostly followed) conventions are:
| Item | Convention |
|---|---|
| Crates | snake_case (but prefer single word) |
| Modules | snake_case |
| Types | UpperCamelCase |
| Traits | UpperCamelCase |
| Enum variants | UpperCamelCase |
| Functions | snake_case |
| Methods | snake_case |
| General constructors | new or with_more_details |
| Conversion constructors | from_some_other_type |
| Local variables | snake_case |
| Static variables | SCREAMING_SNAKE_CASE |
| Constant variables | SCREAMING_SNAKE_CASE |
| Type parameters | concise UpperCamelCase, usually single uppercase letter: T |
| Lifetimes | short, lowercase: 'a |
Fine points
In UpperCamelCase, acronyms count as one word: use Uuid rather than
UUID. In snake_case, acronyms are lower-cased: is_xid_start.
In UpperCamelCase names multiple numbers can be separated by a _
for clarity: Windows10_1709 instead of Windows101709.
In snake_case or SCREAMING_SNAKE_CASE, a "word" should never
consist of a single letter unless it is the last "word". So, we have
btree_map rather than b_tree_map, but PI_2 rather than PI2.
unwrap, into_foo and into_inner
There has been a long
running
debate
about the name of the
unwrap method found in Option and Result, but also a few other
standard library types. Part of the problem is that for some types
(e.g. BufferedReader), unwrap will never panic; but for Option
and Result calling unwrap is akin to asserting that the value is
Some/Ok.
There's basic agreement that we should have an unambiguous term for
the Option/Result version of unwrap. Proposals have included
assert, ensure, expect, unwrap_or_panic and others; see the
links above for extensive discussion. No clear consensus has emerged.
This RFC proposes a simple way out: continue to call the methods
unwrap for Option and Result, and rename other uses of
unwrap to follow conversion conventions. Whenever possible, these
panic-free unwrapping operations should be into_foo for some
concrete foo, but for generic types like RefCell the name
into_inner will suffice. By convention, these into_ methods cannot
panic; and by (proposed) convention, unwrap should be reserved for
an into_inner conversion that can.
Drawbacks
Not really applicable; we need to finalize these conventions.
Unresolved questions
Are there remaining subtleties about the rules here that should be clarified?