- 3 Posts
- 7 Comments
shape_warrior_t@programming.devto
Rust@programming.dev•things rust shipped without (2015)English
12·5 months agoThere was a recent langdev Stack Exchange question about this very topic. It’s a bit trickier to design than it might seem at first.
Suppose we require a keyword – say
var– before all binding patterns. This results in having to write things like
for (&(var x1, var y1, var z1), &(var x2, var y2, var z2)) in points.iter().tuple_windows() {},
which is quite a bit more verbose than the current
for (&(x1, y1, z1), &(x2, y2, z2)) in points.iter().tuple_windows() {}.
Not to mention you’ll have to writelet var x = 0;just to declare a variable, unless you redesign the language to allow you to just writevar x = 0(and if you do that, you’ll also have to somehow support a coherent way to expressif let Some(x) = arr.pop() {}andlet Some(x) = arr.pop() else {todo!()}).Suppose we require a keyword – say
const– before all value-matching patterns that look like variables. Then, what’s currentlymatch (left.next(), right.next()) { (Some(l), Some(r)) => {} (Some(l), None) => {} (None, Some(r)) => {} (None, None) => {} }turns into either the inconsistently ugly
match (left.next(), right.next()) { (Some(l), Some(r)) => {} (Some(l), const None) => {} (const None, Some(r)) => {} (const None, const None) => {} }or the even more verbose
match (left.next(), right.next()) { (const Some(l), const Some(r)) => {} (const Some(l), const None) => {} (const None, const Some(r)) => {} (const None, const None) => {} }and you always run the risk of forgetting a
constand accidentally binding a new match-all variable namedNone– the main footgun that syntactically distinguishing binding and value-matching patterns was meant to avoid in the first place.Suppose we require a sigil such as
before one type of pattern. Probably the best solution in my opinion, but that’s one symbol that can no longer be used for other things in a pattern context. Also, if you’re already using sigils before variable names for other purposes (I’ve been sketching out a language where a pointer variable$xcan be auto-dereferenced by writingx), doubling up is really unpleasant.…So I can understand why Rust chose to give the same, most concise possible syntax for both binding and value-matching patterns. At least compiler warnings (unused, non-snake-case variables) are there to provide some protection from accidentally turning one into the other.
I would certainly rather see this than
{isAdmin: bool; isLoggedIn: bool}. Withboolean | null, at least illegal states are unrepresentable… even if the legal states are represented in an… interesting way.
shape_warrior_t@programming.devto
Programmer Humor@programming.dev•Object oriented programming in Python be like:English
19·7 months agoEven regular Rust code is more “exciting” than Python in this regard, since you have a choice between
self,&self, and&mut self. And occasionallymut self,&'a self, and evenself: Box<Self>. All of which offer different semantics depending on what exactly you’re trying to do.
shape_warrior_t@programming.devto
Programmer Humor@programming.dev•Gambling with LainEnglish
1·7 months agoYou can get the exclusive behaviour with
random.randrange. (Relevant Stack Overflow question with a somewhat interesting answer)
shape_warrior_t@programming.devto
Programmer Humor@programming.dev•Learning to program in rustEnglish
13·7 months agoCan’t resist pointing out how you should actually write the function in a “real” scenario (but still not handling errors properly), in case anyone wants to know.
If the list is guaranteed to have exactly two elements:
fn is_second_num_positive_exact(input: &str) -> bool { let (_, n) = input.split_once(',').unwrap(); n.parse::<i32>().unwrap() > 0 }If you want to test the last element:
fn is_last_num_positive(input: &str) -> bool { let n = input.split(',').next_back().unwrap(); n.parse::<i32>().unwrap() > 0 }If you want to test the 2nd (1-indexed) element:
fn is_second_num_positive(input: &str) -> bool { let n = input.split(',').nth(1).unwrap(); n.parse::<i32>().unwrap() > 0 }
shape_warrior_t@programming.devto
Programmer Humor@programming.dev•RFC 2119, the audiobookEnglish
1·7 months agoI can imagine Berdly Deltarune trying to explain this to Kris and Noelle in roughly this tone of voice.


Not very familiar with the libraries, and BB_C has already given a lot of more detailed feedback, but here are some small things:
get_files_in_diras a single chain of method calls, you can still replacewithif dir.is_err() { return None }; // use dir.unwrap()In general, if you can uselet Ok(dir) = dir else { return None; }; // use dirif letorlet elseto pattern match, prefer that over unwrapping – Clippy has a lint relating to this, actually.return Noneinget_files_in_dir.