DEV Community

Discussion on: Which is more readable?

Collapse
 
rhymes profile image
rhymes • Edited

You could technically use a parenthesis in the second example and let the key value be nil if the condition is not met.

[1] pry(main)> condition = true
=> true
[2] pry(main)> data = {
[2] pry(main)*   user: "alice",
[2] pry(main)*   comment: ("something" if condition),
[2] pry(main)*   metadata: ("something else" unless condition),
[2] pry(main)* }
=> {:user=>"alice", :comment=>"something", :metadata=>nil}
[3] pry(main)> _.compact
=> {:user=>"alice", :comment=>"something"}

Another strategy is to use tap

[1] pry(main)> condition = true
=> true
[2] pry(main)> data = { user: "alice" }
=> {:user=>"alice"}
[3] pry(main)> data.tap do |d|
[3] pry(main)*   d[:comment] = "something" if condition
[3] pry(main)*   d[:metadata] = "something else" unless condition
[3] pry(main)* end
=> {:user=>"alice", :comment=>"something"}

It's not a perfect solution but it allows you to build the dictionary in blocks. You can also attach multiple "taps".

Collapse
 
andy profile image
Andy Zhao (he/him)

Hmmmmmm interesting. I do want to avoid having a nil value. The tap is an interesting solution but I think it seems too verbose for creating a single use hash.

Collapse
 
rhymes profile image
rhymes

nil + compact then ?

Tap is great to create a pipe of operations, a little overkill with your use case yeah

Thread Thread
 
andy profile image
Andy Zhao (he/him)

nil + compact also seems overkill :/ Feels like an extra operation when I can skip it with a single line if.

Thread Thread
 
rhymes profile image
rhymes

you're right, the first solution is the clearest

The alternatives are "tricks" :D