foo = [*bar] implies foo.equal?(bar)
I just ran into this as a result of some slightly sloppy coding, but it did disagree with my internal assumptions.
Normally, I expect the Array literal syntax to create a new object, every time. So when I rewrote some code and ended up with something similar to the following, my tests broke, and I'm not sure that's how it should be. Here's the reduced test case:
some_ary = [1, 2, 3]
bar = [*some_ary]
bar << 4
[1, 2, 3, 4]
[1, 2, 3, 4]
I see it's clearly taking an opportunity for optimization, so I'm more than happy to hear that as a reason for rejecting this. It does warrant documentation somewhere, though, I'd say. Not sure where that documentation would go.
#3 [ruby-core:39073] Updated by Koichi Sasada over 4 years ago
- ruby -v changed from ruby 1.9.2p188 (2011-03-28 revision 31204) [x86_64-darwin10.7.0] to -
Sorry for late response.
(2011/07/31 6:48), Nobuyoshi Nakada wrote:
It's easy to fix that splatarray always makes a new array, but I'm uncertain of its flag.
Could you apply your patch if there is no failure on test-all/ruby-spec?
// SASADA Koichi at atdot dot net
#7 Updated by Yui NARUSE over 3 years ago
- Status changed from Assigned to Closed
- % Done changed from 0 to 100
This issue was solved with changeset r36228.
Michael, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.
merge revision(s) 34633: [Backport #5124]
* insns.def (splatarray): make new array if flag is set. * compile.c (iseq_compile_each): make new array with splat. [Feature #1125]