DEV Community

Josua Schmid
Josua Schmid

Posted on • Edited on

1

Abysmal Shorthand Syntax

I'm ready to conclude about the Ruby 3.1 hash shorthand syntax.

The new syntax allows you to write more concise code where you pass-on local variables to methods or hashes.

@@ -1,3 +1,3 @@
 def log_json(level:, message:)
-  Logger.log({ level: level, message: message }.to_json)
+  Logger.log({ level:, message: }.to_json)
 end
Enter fullscreen mode Exit fullscreen mode

I think this is useful, but only in rare cases, for example if there is a lot of redirection.

But there is one really big issue with the new syntax:
rubocop choose the wrong default (EnforcedShorthandSyntax: always).

The following reasoning would speak for the much better default setting EnforcedShorthandSyntax: either.

1. It's hard to spot

For example try to distinguish between the following two statements which mean something completely different.

expect(RealtySnapshot.all).to all(have_attributes(realty:))
expect(RealtySnapshot.all).to all(have_attributes(:realty))
Enter fullscreen mode Exit fullscreen mode

2. It's not good prose

build(:realty, address:)
Enter fullscreen mode Exit fullscreen mode

It indicates to my mind that address is empty. My mind replaces the non-existent anything after the colon with nil.

3. Maintaining consistency is cumbersome.

Assume you call a FactoryBot factory like this:

build(:realty, address:)
Enter fullscreen mode Exit fullscreen mode

As soon as you add another parameter you'll need to change the whole parameter list to be consistent.

build(:realty, address: address, active: true)
Enter fullscreen mode Exit fullscreen mode

Conclusion

I see that the hash shorthand syntax should bring us some joy over from the JavaScript world, but I don't think this went well. The shorthands just works better in JavaScript because the role of the colon is much more limited.

Top comments (0)

Image of Docusign

🛠️ Bring your solution into Docusign. Reach over 1.6M customers.

Docusign is now extensible. Overcome challenges with disconnected products and inaccessible data by bringing your solutions into Docusign and publishing to 1.6M customers in the App Center.

Learn more