Thank You! My faith in humanity (ok, Rust) is (partially) restored. 
Here's the full Rust equivalent to the D and Nim snippets.
fn main() {
let mut val = String::new();
std::io::stdin().read_line (&mut val).expect("Failed to read line");
let mut substr_iter = val.split_whitespace();
let mut next_or_default = |def| -> usize {
substr_iter.next().unwrap_or(def)
.parse().expect("Input is not a number")
};
let mut end_num = next_or_default("3");
let mut start_num = next_or_default("3");
if start_num > end_num { std::mem::swap(&mut end_num, &mut start_num) }
println!("start_num = {}, end_num = {}", start_num, end_num);
}
And some (desired) output.
$ echo 12 | ./input2
start_num = 3, end_num = 12
$ echo 12 5 | ./input2
start_num = 5, end_num = 12
$ echo 12 50 | ./input2
start_num = 12, end_num = 50
What I'm about to say I know you've heard before, but I want to give feedback on how the experience of getting this to work makes me feel about Rust (and feelings are reality to the feeler).
I'm trying to learn Rust by translating already developed code that works. My primary language has been Ruby for over 12 years now, though I've been a professional programmer (i.e. I did it for work) for over 35 years now. Thus I know how to see code in one language and learn how to translate it into another, once I understand the paradigm of the new language.
You know Rust is hard to learn, which is why you have some of the best documentation of any language. You have one of the best language forums, as the help provided herein for this problem demonstrates. But it's still not enough.
But here's what I still feel after all is said and done.
I have no real understanding what each component of next_or_default
is doing, or why it's needed. If I had to do something close, but just a little different, I don't feel comfortable I could write something I know would work out of the box. It's almost like performing magic. If you want to do this, wave your hands this way, if you want to do that, wave them another way.
I know sometimes people developing languages don't see how people trying to learn the language sees it. I mean, you know and understand the language, and things seem obvious to you, and you may not feel it's necessary to explain in gritty detail how/why things work in specific ways.
I would just encourage you to present more documentation to demonstrate how to perform basic and general standard programming tasks in Rust, sort of like Rosetta Code for Rust. How to do this, that, and the other in Rust, like for this example.
Again, I appreciate the immediate help I received from the forum for this issue. I'm making (another) attempt to learn enough Rust to use it for my projects. I get frustrated, I leave, I come back, repeat loop. Hopefully the "I leave" periods will get shorter as I feel more like I understand how to write Rust code.