(a, b) *= 50;
To zależy do czego chcesz prowadzić język.
Odpowiadając na pytanie:
Czy gdyby język, w którym piszesz na co dzień, miał taki feature, korzystałbyś z niego?
Gdyby C# miał taki feature to byłby to WTF, bo kompletnie nie pasowałoby do reszty języka.
Podobnie Java, C++ (chociaż jeśli analogiczny feature wejdzie w C++17 to mnie to nie zdziwi. W C++ mnie już nie zdziwi :P), etc...
Z tego wynika, że jeśli chcesz żeby Twój język był kopią C#/Javy/C++ z inną składnią, to zły pomysł.
Jeśli chcesz zaszaleć z własnymi pomysłami, to zapis (a, b) *= 5
miałby sens jeśli (a, b) byłoby wyrażeniem typu krotka referencji
czy coś równie odjechanego:
a = 2
t = (a, 5)
a = 3
t *= 2
print t # (6, 10)
print a # 6
Prawdopodobnie taki feature to niezbyt szczęśliwy pomysł, ale można eksperymentować ;)
W przeciwnym wypadku (a, b) *= 50;
jako syntax sugar na dwa mnożenia wypada trochę blado.
<dygresja>
Z trzeciej strony, są języki w których coś podobnego da się złożyć, a nie jest to standardowe podejście. POC:
```cpp
#include <iostream>
using namespace std;
// <- sensowne podejście do designowania takiej klasy, ale wyszłoby pewnie duużo więcej kodu
// template<typename... params="Params">
// class ref_tuple {
// ref_tuple(Params... params) {
// }
// }
// <- a tutaj po prostu krótki hack żeby przykład zadziałał (nie żeby to był dobry pomysł)
class ref_tuple {
int *a, *b;
public:
ref_tuple(int &a, int &b) {
this->a = &a;
this->b = &b;
}
void operator*=(int n) {
*a *= n; *b *= n;
}
};
int main() {
int a = 2, b = 3;
ref_tuple(a, b) *= 2;
cout << a << b << endl;
}
</dygresja>
Za to dla:
`(a, b, c) = func();`
jako (a = func(), b = func(), c = func()) nie potrafię znaleźć sensownego uzasadnienia :P. (Sensowne by było np. func() zwraca trzy elementy/listę/wektor, a, b, c = wynik func())