[ruby-core:109872] [Ruby master Feature#16122] Data: simple immutable value object
From:
"zverok (Victor Shepelev)" <noreply@...>
Date:
2022-09-10 12:35:05 UTC
List:
ruby-core #109872
SXNzdWUgIzE2MTIyIGhhcyBiZWVuIHVwZGF0ZWQgYnkgenZlcm9rIChWaWN0b3IgU2hlcGVsZXYp LgoKClB1bGwgcmVxdWVzdDogaHR0cHM6Ly9naXRodWIuY29tL3J1YnkvcnVieS9wdWxsLzYzNTMK CkNvcHlpbmcgZnJvbSBpdHMgZGVzY3JpcHRpb246CgpFeGFtcGxlIGRvY3MgcmVuZGVyaW5nOiBb RGF0YV0oaHR0cHM6Ly96dmVyb2suc3BhY2UvcnVieS1yZG9jL0RhdGEuaHRtbCkKCkRlc2lnbiBh bmQgaW1wbGVtZW50YXRpb24gZGVjaXNpb25zIG1hZGU6CgoqKjEuIFRoZSAiZGVmaW5lIGRhdGEg b2JqZWN0IG1ldGhvZCBpcyBjYWxsZWQgYERhdGEuZGVmaW5lYCoqLiBBcyBwZXIgW01hdHpdKGh0 dHBzOi8vYnVncy5ydWJ5LWxhbmcub3JnL2lzc3Vlcy8xNjEyMiNub3RlLTUxKToKPiBgZGVmaW5l YCBtaWdodCBiZSBhIGNhbmRpZGF0ZS4gQnV0IEkgc3RpbGwgcHJlZmVyIHNob3J0ZXIgb25lIChl LmcuIGBkZWZgKSwgYnV0IHlvdSBjYW4gdHJ5IHRvIHBlcnN1YWRlIG1lLgoKVGhlcmUgd2VyZSBh IGZldyBxdWl0ZSByZWFzb25hYmxlIGFyZ3VtZW50cyB0b3dhcmRzIGBkZWZpbmVgIGluIHRoYXQg dGlja2V0LiBUbyBhZGQgdG8gdGhlbSwgbXkgUG9WOgoqIEkgYmVsaWV2ZSB0aGF0IG5vd2FkYXlz IChhZGRpbmcgbmV3IEFQSXMgdG8gdGhlIG1hdHVyZSBsYW5ndWFnZSksIGl0IGlzIGJldHRlciB0 byB1c2UgZnVsbCBFbmdsaXNoIHdvcmRzIHRvIHJlbW92ZSBjb25mdXNpb24gYW5kIGluY3JlYXNl IHJlYWRhYmlsaXR5OwoqIGBkZWZgIGlzIHN0cm9uZ2x5IGFzc29jaWF0ZWQgaW4gUnVieSB3aXRo ICJkZWZpbmluZyBhIG1ldGhvZCIgYW5kIGJlY2FtZSBhIHNlcGFyYXRlIHdvcmQgaW4gUnVieWlz dCdzIGRpY3Rpb25hcnksIG5vdCBhICJnZW5lcmljIHNob3J0Y3V0IGZvciAnZGVmaW5lJyIKKiBJ IGJlbGlldmUgdGhhdCB0aGUgImRlZmluaXRpb24gb2YgdGhlIG5ldyB0eXBlIiAodW5saWtlIHRo ZSBkZWZpbml0aW9uIG9mIGEgbmV3IG1ldGhvZCkgaXMgYSBzaXR1YXRpb24gd2hlcmUgY2xhcml0 eSBpcyBtb3JlIGltcG9ydGFudCB0aGFuIHNhdmluZyAzIGNoYXJzOyBhbmQgc29tZXdoYXQgcmFy ZXIuCgoqKjIuIGBkZWZpbmVgIGFjY2VwdHMga2V5d29yZCBhbmQgcG9zaXRpb25hbCBhcnM7IHRo ZXkgYXJlIGNvbnZlcnRlZCB0byBrZXl3b3JkIGFyZ3MgdGhlcmUsIGFuZCBjaGVja2VkIGluIGBp bml0aWFsaXplYCoqCgpgYGBydWJ5Ck1lYXN1cmUgPSBEYXRhLmRlZmluZSg6YW1vdW50LCA6dW5p dCkKTWVhc3VyZS5uZXcoMSwgJ2ttJykgIyA9PiBPSwpNZWFzdXJlLm5ldyhhbW91bnQ6IDEsIHVu aXQ6ICdrbScpICMgPT4gT0sKTWVhc3VyZS5uZXcoMSkgIyBBcmd1bWVudEVycm9yCk1lYXN1cmUu bmV3KGFtb3VudDogMSkgIyBBcmd1bWVudEVycm9yCk1lYXN1cmUubmV3KDEsICdrbScsICdoJykg IyBBcmd1bWVudEVycm9yCk1lYXN1cmUubmV3KGFtb3VudDogMSwgdW5pdDogJ2ttJywgY29tbWVu dDogJ3Nsb3cnKSAjPT4gQXJndW1lbnRFcnJvcgpgYGAKVGhlIGZhY3QgdGhhdCBgaW5pdGlhbGl6 ZWAgYWNjZXB0cyBvbmx5IGtleXdvcmQgYXJncyBhbmQgY2hlY2tzIHRoZW0gbWFrZXMgaXQgZWFz eSB0byBkZWZpbmUgY3VzdG9tIGBpbml0aWFsaXplYCB3aXRoIGRlZmF1bHRzLCBmb3IgZXhhbXBs ZSAoaXQgaXMgYWxsIGV4cGxpY2l0bHkgZG9jdW1lbnRlZCwgc2VlIGxpbmsgYWJvdmUpOgpgYGBy dWJ5Ck1lYXN1cmUgPSBEYXRhLmRlZmluZSg6YW1vdW50LCA6dW5pdCkgZG8KICBkZWYgaW5pdGlh bGl6ZShhbW91bnQ6LCB1bml0OiAnLW5vbmUtJykgPSBzdXBlcgplbmQKCk1lYXN1cmVbMV0gIz0+ ICM8ZGF0YSBNZWFzdXJlIGFtb3VudD0xLCB1bml0PSItbm9uZS0iPgpgYGAKKFRoaXMgbWlnaHQg YmUgZW5vdWdoIGZvciBub3QgdG8gaW52ZW50IGEgc2VwYXJhdGUgQVBJIGZvciBkZWZhdWx0IHZh bHVlcywgYnV0IHRoaXMgZGlzY3Vzc2lvbiBjYW4gYmUgcG9zdHBvbmVkLikKCioqMy4gSSBkaWRu J3QgaW50cm9kdWNlIGFueSBhZGRpdGlvbmFsIEFQSXMgeWV0IChlLmcuIHNvbWV0aGluZyBsaWtl IGB3aXRoYCB3aGljaCB3YXMgZGlzY3Vzc2VkKS4qKiBTbywgdGhlIGZ1bGwgQVBJIG9mIHRoZSBg RGF0YWAgYXMgcmVuZGVyZWQgYnkgUkRvYyBpczoKIVtpbWFnZV0oaHR0cHM6Ly91c2VyLWltYWdl cy5naXRodWJ1c2VyY29udGVudC5jb20vMTI5NjU2LzE4OTQ4MzMwOS01OWVjZDQyNC02MmJhLTQw MTQtYTRiNi1lNjRhOGEwN2UwMjEucG5nKQoKSSBiZWxpZXZlIGl0IGlzIGVub3VnaCBmb3IgdGhl IGludHJvZHVjdGlvbiwgYW5kIHRoZW4gdGhlIGZlZWRiYWNrIG1pZ2h0IGJlIGFjY2VwdGVkIGZv ciBob3cgdG8gbWFrZSBpdCBtb3JlIGNvbnZlbmllbnQuCgoqKjQuIEkgd3JvdGUgY3VzdG9tIGRv Y3MgZm9yIGBEYXRhYCBjbGFzcyoqIGluc3RlYWQgb2YgY29weS1wYXN0aW5nL2VkaXRpbmcgZG9j cyBmb3IgYFN0cnVjdGAuIEkgaGF2ZSBhIHN0cm9uZyBiZWxpZWYgdGhhdCB0aGUgYXBwcm9hY2gg dG8gZG9jcyB1c2VkIGlzIG1vcmUgYXBwcm9wcmlhdGU6CjEuIEZvciBzZXBhcmF0ZSBtZXRob2Rz LCBpbnN0ZWFkIG9mIGRldGFpbGVkIGRvY3VtZW50aW5nIG9mIGV2ZXJ5IGJlaGF2aW9yIHF1aXJr IGJ5IHNwZWxsaW5nIGl0IGluIG1hbnkgcGhyYXNlcywgSSBwcm92aWRlZCB0aGUgZXhwbGFuYXRp b24gb2YgX3doYXRfIGl0IGRvZXMgbG9naWNhbGx5IGFuZCBleGFtcGxlcyBvZiBfaG93XyBpdCBj YW4vc2hvdWxkIGJlIHVzZWQuCjIuIEZvciB0aGUgZW50aXJlIGNsYXNzLCBJIGRvbid0IHNlZSBh IHBvaW50IGluIHRoZSByZWNlbnRseSBpbnRyb2R1Y2VkIGZvcm1hbCBzdHJ1Y3R1cmUgb2YgIldo YXQncyBoZXJlIiB3aXRoIG1hbnkgbmVzdGVkIHNlY3Rpb25zLCBhdCBsZWFzdCBmb3Igc21hbGwg Y2xhc3Nlcy4gSXQgc2FjcmlmaWNlcyB0aGUgbGlnaHR3ZWlnaHQteWV0LWVub3VnaCBleHBsYW5h dGlvbnMgdGhhdCBjYW4gYmUgY29uc3VtZWQgYWxtb3N0IGluc3RhbnRseSwgdG93YXJkcyB0aGUg ZmVlbGluZyBvZiAidGhlcmUgaXMgYSBib29rLXdvcnRoIG9mIGluZm9ybWF0aW9uIHRvIHJlYWQs IiBtYWtpbmcgdGhlIGRvY3VtZW50YXRpb24gdXNlcidzIGV4cGVyaWVuY2UgbW9yZSBsYWJvcmlv dXMuCgpQcm9iYWJseSBpdCBpcyBub3QgYSBnb29kIHBsYWNlIHRvIGRpc2N1c3MgdGhvc2UgYXBw cm9hY2hlcyBpbiBnZW5lcmFsLCBidXQgYXQgbGVhc3QgZm9yIHRoZSBEYXRhIGNsYXNzLCBJIGJl bGlldmUgdGhlIGNob3NlbiBhcHByb2FjaCBpcyBzdXBlcmlvci4gSWYgdGhlIGNvcmUgdGVhbSBi ZWxpZXZlcyBpdCBpcyBub3QgdHJ1ZSwgSSB0aGluayBteSBjaGFuZ2VzIGNhbiBiZSBtZXJnZWQg YW5kIHRoZW4gZm9ybWFsIGRvY3MgcHJvdmlkZWQgYnkgdGVhbSBtZW1iZXJzIHdobyBjb25zaWRl ciB0aGVtIHZhbHVhYmxlLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQpGZWF0dXJlICMxNjEyMjogRGF0YTogc2ltcGxlIGltbXV0YWJsZSB2YWx1ZSBvYmplY3QKaHR0 cHM6Ly9idWdzLnJ1YnktbGFuZy5vcmcvaXNzdWVzLzE2MTIyI2NoYW5nZS05OTExMgoKKiBBdXRo b3I6IHp2ZXJvayAoVmljdG9yIFNoZXBlbGV2KQoqIFN0YXR1czogQXNzaWduZWQKKiBQcmlvcml0 eTogTm9ybWFsCiogQXNzaWduZWU6IHp2ZXJvayAoVmljdG9yIFNoZXBlbGV2KQotLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCioqVmFsdWUgT2JqZWN0KiogaXMgYSB1c2Vm dWwgY29uY2VwdCwgaW50cm9kdWNlZCBieSBNYXJ0aW4gRm93bGVyIChbaGlzIHBvc3RdKGh0dHBz Oi8vbWFydGluZm93bGVyLmNvbS9ibGlraS9WYWx1ZU9iamVjdC5odG1sKSwgW1dpa2lwZWRpYSBF bnRyeV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVmFsdWVfb2JqZWN0KSkgd2l0aCB0 aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgKHNpbXBsaWZ5aW5nIHRoZSBpZGVhKToKCiogcmVwcmVz ZW50aW5nIHNvbWUgcmVsYXRpdmVseSBzaW1wbGUgZGF0YTsKKiBpbW11dGFibGU7CiogY29tcGFy ZWQgYnkgdHlwZSAmIHZhbHVlOwoqIG5pY2VseSByZXByZXNlbnRlZC4KClZhbHVlIG9iamVjdHMg YXJlIHN1cGVyLXVzZWZ1bCBlc3BlY2lhbGx5IGZvciBkZWZpbmluZyBBUElzLCB0aGVpciBpbnB1 dC9yZXR1cm4gdmFsdWVzLiBSZWNlbnRseSwgdGhlcmUgd2VyZSBzb21lIG1vdmVtZW50IHRvd2Fy ZHMgdXNpbmcgbW9yZSBpbW11dGFiaWxpdHktZnJpZW5kbHkgYXBwcm9hY2ggaW4gUnVieSBwcm9n cmFtbWluZywgbGVhZGluZyB0byBjcmVhdGluZyBzZXZlcmFsIGRpc2N1c3Npb25zL2xpYnJhcmll cyB3aXRoIHZhbHVlIG9iamVjdHMuIEZvciBleGFtcGxlLCBbVG9tIERhbGxpbmcncyBnZW1dKGh0 dHBzOi8vZ2l0aHViLmNvbS90b21kYWxsaW5nL3ZhbHVlX3NlbWFudGljcyksIFtHb29kIFJ1Ynkg VmFsdWUgb2JqZWN0IGNvbnZlbnRpb25dKGh0dHBzOi8vZ2l0aHViLmNvbS96dmVyb2svZ29vZC12 YWx1ZS1vYmplY3QpIChkaXNjbGFpbWVyOiB0aGUgbGF0dGVyIGlzIG1haW50YWluZWQgYnkgeW91 cnMgdHJ1bHkpLgoKSSBwcm9wb3NlIHRvIGludHJvZHVjZSAqKm5hdGl2ZSB2YWx1ZSBvYmplY3Rz KiogdG8gUnVieSBhcyBhIGNvcmUgY2xhc3MuCgoqKldoeSBub3QgYSBnZW0/KioKCiogSSBiZWxp ZXZlIHRoYXQgY29uY2VwdCBpcyB0aGF0IHNpbXBsZSwgdGhhdCBub2JvZHkgKndpbGwgZXZlbiB0 cnkqIHRvIHVzZSBhIGdlbSBmb3IgcmVwcmVzZW50aW5nIGl0IHdpdGgsIHVubGVzcyB0aGUgZnJh bWV3b3JrL2xpYnJhcnkgdXNlZCBhbHJlYWR5IHByb3ZpZGVzIG9uZS4KKiBQb3RlbnRpYWxseSwg YSBsb3Qgb2Ygc3RhbmRhcmQgbGlicmFyeSAoYW5kIHByb2JhYmx5IGV2ZW4gY29yZSkgQVBJcyBj b3VsZCBiZW5lZml0IGZyb20gdGhlIGNvbmNlcHQuCgoqKldoeSBgU3RydWN0YCBpcyBub3QgZW5v dWdoKioKCkNvcmUgYFN0cnVjdGAgY2xhc3MgaXMgInNvbWV3aGF0IGFsaWtlIiB2YWx1ZS1vYmpl Y3QsIGFuZCBmcmVxdWVudGx5IHVzZWQgaW5zdGVhZCBvZiBvbmU6IGl0IGlzIGNvbXBhcmVkIGJ5 IHZhbHVlIGFuZCBjb25zaXN0cyBvZiBzaW1wbGUgYXR0cmlidXRlcy4gT24gdGhlIG90aGVyIGhh bmQsIGBTdHJ1Y3RgIGlzOgoqIG11dGFibGU7CiogY29sbGVjdGlvbi1hbGlrZSAoZGVmaW5lcyBg dG9fYWAgYW5kIGlzIGBFbnVtZXJhYmxlYCk7CiogZGljdGlvbmFyeS1hbGlrZSAoaGFzIGBbXWAg YW5kIGAudmFsdWVzYCBtZXRob2RzKS4KClRoZSBhYm92ZSB0cmFpdHMgc29tZWhvdyBlcm9kZXMg dGhlIHNlbWFudGljcywgbWFraW5nIGNvZGUgbGVzcyBjbGVhciwgZXNwZWNpYWxseSB3aGVuIGR1 Y2stdHlwaW5nIGlzIHVzZWQuCgpGb3IgZXhhbXBsZSwgdGhpcyBjb2RlIHNuaXBwZXQgc2hvd3Mg d2h5IGB0b19hYCBpcyBwcm9ibGVtYXRpYzoKCmBgYHJ1YnkKUmVzdWx0ID0gU3RydWN0Lm5ldyg6 c3VjY2VzcywgOmNvbnRlbnQpCgojIE5vdywgaW1hZ2luZSB0aGF0IG90aGVyIGNvZGUgYXNzdW1l cyBgZGF0YWAgY291bGQgYmUgZWl0aGVyIFJlc3VsdCwgb3IgW1Jlc3VsdCwgUmVzdWx0LCBSZXN1 bHRdCiMgU28sIC4uLgoKZGF0YSA9IFJlc3VsdC5uZXcodHJ1ZSwgJ2l0IGlzIGF3ZXNvbWUnKQoK QXJyYXkoZGF0YSkgIyA9PiBleHBlY3RlZCBbUmVzdWx0KHRydWUsICdpdCBpcyBhd2Vzb21lJyld LCBnb3QgW3RydWUsICdpdCBpcyBhd2Vzb21lJ10KCiMgb3IuLi4KZGVmIGZvbyhhcmcxLCBhcmcy ID0gbmlsKQpwIGFyZzEsIGFyZzIKZW5kCgpmb28oKmRhdGEpICMgPT4gZXhwZWN0ZWQgW1Jlc3Vs dCh0cnVlLCAnaXQgaXMgYXdlc29tZScpLCBuaWxdLCBnb3QgW3RydWUsICdpdCBpcyBhd2Vzb21l J10KYGBgCgpIYXZpbmcgYFtdYCBhbmQgYGVhY2hgIGRlZmluZWQgb24gc29tZXRoaW5nIHRoYXQg aXMgdGhvdWdodCBhcyAianVzdCB2YWx1ZSIgY2FuIGFsc28gbGVhZCB0byBzdWJ0bGUgYnVncywg d2hlbiBzb21lIG1ldGhvZCBjaGVja3MgImlmIHRoZSByZWNlaXZlZCBhcmd1bWVudCBpcyBjb2xs ZWN0aW9uLWFsaWtlIiwgYW5kIHZhbHVlIG9iamVjdCdzIGF1dGhvciBkb2Vzbid0IHRob3VnaHQg b2YgaXQgYXMgYSBjb2xsZWN0aW9uLgoKKipDb25jcmV0ZSBwcm9wb3NhbCoqCgoqIENsYXNzIG5h bWU6IGBTdHJ1Y3Q6OlZhbHVlYDogbG90IG9mIFJ1Ynlpc3RzIGFyZSB1c2VkIHRvIGhhdmUgYFN0 cnVjdGAgYXMgYSBxdWljayAic29tZXRoaW5nLWxpa2UtdmFsdWUiIGRyb3AtaW4sIHNvIGFsdGVy bmF0aXZlLCBtb3JlIHN0cmljdCBpbXBsZW1lbnRhdGlvbiwgYmVpbmcgcGFydCBvZiBgU3RydWN0 YCBBUEksIHdpbGwgYmUgcXVpdGUgZGlzY292ZXJhYmxlOyAqYWx0ZXJuYXRpdmU6IGp1c3QgYFZh bHVlYCoKKiBDbGFzcyBBUEkgaXMgY29weWluZyBgU3RydWN0YHMgb25lIChtb3N0IG9mIHRoZSB0 aW1lIC0tIGV2ZW4gcmV1c2VzIHRoZSBpbXBsZW1lbnRhdGlvbiksIHdpdGggdGhlIGZvbGxvd2lu ZyBleGNlcHRpb25zICoobm90ZTogdGhlIGltbXV0YWJpbGl0eSBpcyAqKm5vdCoqIHRoZSBvbmx5 IGRpZmZlcmVuY2UpKjoKICAqIE5vdCBgRW51bWVyYWJsZWA7CiAgKiBJbW11dGFibGU7CiAgKiBE b2Vzbid0IHRoaW5rIG9mIGl0c2VsZiBhcyAiYWxtb3N0IGhhc2giIChkb2Vzbid0IGhhdmUgYHRv X2FgLCBgdmFsdWVzYCBhbmQgYFtdYCBtZXRob2RzKTsKICAqIENhbiBoYXZlIGVtcHR5IG1lbWJl cnMgbGlzdCAoZnVuIGZhY3Q6IGBTdHJ1Y3QubmV3KCdGb28nKWAgY3JlYXRpbmcgbWVtYmVyLWxl c3MgYFN0cnVjdDo6Rm9vYCwgaXMgYWxsb3dlZCwgYnV0IGBTdHJ1Y3QubmV3KClgIGlzIG5vdCkg dG8gYWxsb3cgdXNhZ2UgcGF0dGVybnMgbGlrZToKCmBgYHJ1YnkKY2xhc3MgTXlTZXJ2aWNlCiAg U3VjY2VzcyA9IFN0cnVjdDo6VmFsdWUubmV3KDpyZXN1bHRzKQogIE5vdEZvdW5kID0gU3RydWN0 OjpWYWx1ZS5uZXcKZW5kCmBgYAoKYE5vdEZvdW5kYCBoZXJlLCB1bmxpa2UsIHNheSwgYE9iamVj dC5uZXcuZnJlZXplYCAoYW5vdGhlciBwYXR0ZXJuIGZvciBjcmVhdGluZyAiZW1wdHkgdHlwZWQg dmFsdWUgb2JqZWN0IiksIGhhcyBuaWNlIGluc3BlY3QgYCM8dmFsdWUgTm90Rm91bmQ+YCwgYW5k IGNyZWF0ZWQgY29uc2lzdGVudGx5IHdpdGggdGhlIGBTdWNjZXNzYCwgbWFraW5nIHRoZSBjb2Rl IG1vcmUgcmVhZGFibGUuIEFuZCBpZiBpdCB3aWxsIGV2b2x2ZSB0byBoYXZlIHNvbWUgYXR0cmli dXRlcywgdGhlIGNvZGUgY2hhbmdlIHdvdWxkIGJlIGVhc3kuCgoqKlBhdGNoIGlzIHByb3ZpZGVk KioKCltTYW1wbGUgcmVuZGVyZWQgUkRvYyBkb2N1bWVudGF0aW9uXShodHRwczovL3p2ZXJvay5n aXRodWIuaW8vcnVieS1yZG9jL1N0cnVjdC1WYWx1ZS5odG1sKQoKLS0tRmlsZXMtLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdHJ1Y3RfdmFsdWUucGF0Y2ggKDE4LjYgS0IpCgoKLS0g Cmh0dHBzOi8vYnVncy5ydWJ5LWxhbmcub3JnLwoKVW5zdWJzY3JpYmU6IDxtYWlsdG86cnVieS1j b3JlLXJlcXVlc3RAcnVieS1sYW5nLm9yZz9zdWJqZWN0PXVuc3Vic2NyaWJlPgo8aHR0cDovL2xp c3RzLnJ1YnktbGFuZy5vcmcvY2dpLWJpbi9tYWlsbWFuL29wdGlvbnMvcnVieS1jb3JlPgo=