Issue #8909 has been updated by headius (Charles Nutter).

Assignee set to matz (Yukihiro Matsumoto)
Target version changed from next minor to current: 2.1.0

#8992 landed changes to optimize String#freeze, and #9043 deals with the possibility of adding a shortcut String#f method.

I believe this issue will now decide:

* Should the compiler optimize some form (or all forms) of literal Array and Hash immediately followed by #frozen?
* What forms should lead to optimization?
* Should #f method be added to Array and Hash as well?

I think we need matz to weigh in here. My opinion:

* Compilers should be allowed to optimize <literal array or hash>.freeze to return the same object when appropriate (i.e. when the elements contained are themselves idempotent). Other cases cannot be optimized.
* A shortcut #f method on Array and Hash would reduce the ugly factor when creating pre-frozen arrays and hashes, and might be nice to have for the same reasons as String#f.

Marking for 2.1 and assigning to matz to get a verdict.
----------------------------------------
Feature #8909: Expand "f" frozen suffix to literal arrays and hashes
https://bugs.ruby-lang.org/issues/8909#change-42889

Author: headius (Charles Nutter)
Status: Feedback
Priority: Normal
Assignee: matz (Yukihiro Matsumoto)
Category: 
Target version: current: 2.1.0


The "f" suffix to declare a frozen string was recently accepted into 2.1, and I think it's a spectacular addition. I would very much like to see it work for literal arrays and hashes too:

[1, 2, 3, 4, 5]f

{foo: 1, bar: 2, baz: 3}f

There are many, many cases where this could reduce allocation (frozen array with literal elements would only need to be allocated once) and improve thread-safety (explicitly create frozen arrays and hashes when creating structures that might be used across threads).

Is there any reason why we could not do this? I believe both of the above syntaxes would be invalid today, as was the case with the String "f" suffix, and hopefully that means the work to add this syntax would be similar.


-- 
http://bugs.ruby-lang.org/