4 ms·
It feels like we are repeating a mistake the PHP community made years ago. PHP supports assignment in expressions, and the community seems to avoid its use. The
by korijn 8y ago
It feels like we are repeating a mistake the PHP community made years ago. PHP supports assignment in expressions, and the community seems to avoid its use. There are plenty of examples of stackoverflow questions and answers where the problem is caused by coders overlooking an assignment in an expression. You just don't expect assignment to occur in an expression, and its visually similar enough to gloss over it.
- Ar-Curunir 8y agoOn the other hand you can assign within expressions in Rust, and it's generally not been an issue that I've seen anyone complain about. However, that might be because the type checker usually catches you if you're making a mistake; assignment/variable binding return the type `()`, which doesn't work inside ifs or whiles
- sametmax 8y agoIn PHP, the "$a = 1" and "$a == 1" look a lot like each others. In rust, you would use "let a = " which removes the ambiguity.
- marcosdumay 8y agoThat's equivalent to the Python's (=) operator, that return None. What Python got now is a different (:=) operator, that behaves like the assignment in C.
- johannes1234321 8y agoBefore there were iterators in PHP `while ($row = fetch_row())` was the only sensible iteration pattern. Before there were exceptions `if ($result = query())` was the cleanest error-checking approach. Also PHP didn't invent that syntax in any way, but followed C (in the end early PHP was a simplified C created by a C programmer) it only later git higher level constructs making this less needed.
- sametmax 8y agoIn PHP, the "if ($a = 1)" and "if ($a == 1)" look a lot like each others. In the Python version, the new "(a := 1)" will stand out compare to the canonical "a == 1" as the ':' and '()' are unexpected here, and scream that it's not regular if test.
- dvlsg 8y agoSame problem in Javascript. There's actually a yoda lint rule that encourages you to write your code like (1 === a) instead, so you don't accidentally make that mistake.
- makapuf 8y agoI hate Yoda assignment in C. Does no good when assigning to variables. I think it's better to use the weird (on purpose) ((x=13)) and forbid x=13
- korijn 8y agoI'm curious to see how it will pan out in practise, but I'm not getting my hopes up. I made a flake8 plugin to forbid assignment expressions: https://github.com/Korijn/flake8-assignexp https://github.com/Korijn/flake8-assignexp Will be released once python 3.8 is out and I can test it.
- geoelectric 8y agoThat seems unnecessarily reactionary, but ok. I agree with the post you're responding to that having a completely separate token for inline assignment fixes the majority of issues that have historically come up with it (which mostly come down to forgetting an = in the ==). Might be worth feeling out the trajectory of the feature before proactively banning it from codebases you control.
- korijn 8y agoYou're right. Like I said, I'm curious to see how it will pan out, but I'm not getting my hopes up. I'm just not a fan of this new syntax. :) IMHO null-safe navigation operators like ?. and ?[] are much more important to have.
- werdnapk 8y agoIn Ruby, this idiom is fairly common as far as I can tell. Perhaps rubocop (code analyzer) warns against it's usage, but I'm not sure.
- korijn 8y agoThere's this: https://github.com/rubocop-hq/ruby-style-guide/pull/65 https://github.com/rubocop-hq/ruby-style-guide/pull/65