16 ms·
I feel where Ruby's optional parenthesis syntax really shines is in method call chaining. e.g. employees.flat_map(&:addresses).map(&:city).uniq.sort #
by iamrohitbanga 8y ago
I feel where Ruby's optional parenthesis syntax really shines is in method call chaining.
e.g.
employees.flat_map(&:addresses).map(&:city).uniq.sort
# in place of
employees().flat_map(&:addresses).map(&:city).uniq().sort()
- globuous 8y agoAs a non-Ruby programmer, this sounds like it makes it non-obvious whether you're calling a class' method or attribute. Do you end up relying on your editor to help you out ?
- techazard 8y agoIt's actually nice that it does not matter if it's a function or attribute that your calling in ruby. Check out the Uniform access principle (https://en.wikipedia.org/wiki/Uniform_access_principle https://en.wikipedia.org/wiki/Uniform_access_principle). When used correctly you can write IMHO really clean and concise OOP code where (cascading) changes are easily made.
- pavel_lishin 8y agoWhere this kills me is ambiguous commas. something = [ alpha beta, gamma ] I have no idea if I just invoked alpha(beta, gamma) and put the result into a single-member array, or if I've got an array with two elements - alpha(beta) and gamma.
- dragonwriter 8y agoIt's not actually ambiguous; though it is a bit of language-specific syntax to learn.
- iamrohitbanga 8y agoAgreed. It is the "idiomatic" way of writing code in Ruby. I love Java but writing lambda expressions in Java with deeply nested parenthesis makes the code really ugly and less readable esp with chaining. As far as I understand, Ruby style is writing the code in the most elegant way to increase readability and (hopefully) reduce chances of bugs.
- pavel_lishin 8y agoSo what would you expect my example above do, at a glance? Or is my example something that a good Ruby developer never write at all?
- pavel_lishin 8y agoIt's not ambiguous to the computer, but it is ambiguous to a human at a glance.
- techazard 8y agoYep you can create ambiguous nasty code like this. It's is clearly not expressing intent, so you would add parentheses.
- dragonwriter 8y ago> As a non-Ruby programmer, this sounds like it makes it non-obvious whether you're calling a class' method or attribute. “Attributes” in Ruby are just methods that do attribute-like things, so there is no ambiguity: it is always a method.
- wongarsu 8y agoEvery langauge with native support for property setters and getters has the same problem. C# has decent IDE support, in JS we pretend it never happens, Ruby is at least upfront
- fake-name 8y agoAs someone who writes basically only C++ and Python, that code looks like a nightmare.
- yen223 8y agoPython has the `@property` decorator, which effectively disguises method calls as attribute access. To me, that's as bad, if not worse, than the ruby code posted above.
- pavel_lishin 8y agoOh thank god, we saved ourselves six characters! And the only thing we sacrificed is knowing for sure whether we're accessing an object's property, or calling a method!
- goatlover 8y agoIt's all methods in Ruby. Properties are private. You access them via methods.