[#111121] [Ruby master Bug#19165] Method (with no param) delegation with *, **, and ... is slow — "matsuda (Akira Matsuda)" <noreply@...>

Issue #19165 has been reported by matsuda (Akira Matsuda).

9 messages 2022/12/01

[#111135] [Ruby master Bug#19167] Object#inspect does not correctly show NilClass TrueClass and FalseClass stored in instance variables — "tompng (tomoya ishida)" <noreply@...>

Issue #19167 has been reported by tompng (tomoya ishida).

7 messages 2022/12/01

[#111183] [Ruby master Misc#19178] How does CRuby handle CVE issues in stdlib gems which get patched? — "Segaja (Andreas Schleifer)" <noreply@...>

Issue #19178 has been reported by Segaja (Andreas Schleifer).

14 messages 2022/12/03

[#111220] [Ruby master Bug#19187] Ruby 3.1.3 testsuite fails after timezone 2022g update is applied — "coolo (Stephan Kulow)" <noreply@...>

Issue #19187 has been reported by coolo (Stephan Kulow).

11 messages 2022/12/06

[#111264] [Ruby master Feature#19197] Add Exception#root_cause — "AMomchilov (Alexander Momchilov)" <noreply@...>

Issue #19197 has been reported by AMomchilov (Alexander Momchilov).

8 messages 2022/12/12

[#111272] [Ruby master Bug#19231] Integer#step and Float::INFINITY - inconsistent behaviour when called with and without a block — "andrykonchin (Andrew Konchin)" <noreply@...>

Issue #19231 has been reported by andrykonchin (Andrew Konchin).

7 messages 2022/12/13

[#111279] [Ruby master Bug#19233] Failed to install sqlite3 gem since 7f1ca666424849134990d022266bcd4d6636465f using Docker — "yahonda (Yasuo Honda)" <noreply@...>

Issue #19233 has been reported by yahonda (Yasuo Honda).

9 messages 2022/12/14

[#111306] [Ruby master Feature#19236] Allow to create hashes with a specific capacity from Ruby — "byroot (Jean Boussier)" <noreply@...>

Issue #19236 has been reported by byroot (Jean Boussier).

15 messages 2022/12/15

[#111318] [Ruby master Misc#19240] DevMeeting-2023-01-19 — "mame (Yusuke Endoh) via ruby-core" <ruby-core@...>

Issue #19240 has been reported by mame (Yusuke Endoh).

14 messages 2022/12/16

[#111339] [Ruby master Feature#19245] Strict mode for Array#pack that doesn't silently truncate numbers that are too large for the given directive — "byroot (Jean Boussier) via ruby-core" <ruby-core@...>

Issue #19245 has been reported by byroot (Jean Boussier).

8 messages 2022/12/20

[#111342] [Ruby master Bug#19246] Rebuilding the loaded feature index much slower in Ruby 3.1 — "thomthom (Thomas Thomassen) via ruby-core" <ruby-core@...>

Issue #19246 has been reported by thomthom (Thomas Thomassen).

22 messages 2022/12/20

[#111361] [Ruby master Bug#19248] TestGCCompact#test_moving_objects_between_size_pools test failure — "vo.x (Vit Ondruch) via ruby-core" <ruby-core@...>

Issue #19248 has been reported by vo.x (Vit Ondruch).

25 messages 2022/12/21

[#111400] [Ruby master Bug#19254] Enabling YJIT configuration option breaks rspec-core test suite — "vo.x (Vit Ondruch) via ruby-core" <ruby-core@...>

Issue #19254 has been reported by vo.x (Vit Ondruch).

7 messages 2022/12/23

[#111448] [Ruby master Bug#19266] URI::Generic should use URI::RFC3986_PARSER instead of URI::DEFAULT_PARSER — "gareth (Gareth Adams) via ruby-core" <ruby-core@...>

Issue #19266 has been reported by gareth (Gareth Adams).

9 messages 2022/12/26

[#111456] [Ruby master Bug#19271] irb ignores rbs and debug with YJIT enabled — "olivierlacan (Olivier Lacan) via ruby-core" <ruby-core@...>

Issue #19271 has been reported by olivierlacan (Olivier Lacan).

9 messages 2022/12/27

[#111461] [Ruby master Feature#19272] Hash#merge: smarter protocol depending on passed block arity — "zverok (Victor Shepelev) via ruby-core" <ruby-core@...>

Issue #19272 has been reported by zverok (Victor Shepelev).

9 messages 2022/12/27

[#111465] [Ruby master Bug#19273] [Regexp] regexp does not does not match expected — "taichi730 (Taichi Ishitani) via ruby-core" <ruby-core@...>

Issue #19273 has been reported by taichi730 (Taichi Ishitani).

8 messages 2022/12/28

[#111477] [Ruby master Bug#19275] Bundled gems extensions are not installed with 3.2.0 release tarball — "xtkoba (Tee KOBAYASHI) via ruby-core" <ruby-core@...>

Issue #19275 has been reported by xtkoba (Tee KOBAYASHI).

8 messages 2022/12/28

[#111480] [Ruby master Misc#19276] It is not possible to reply to emails from rubymine — "graywolf (Gray Wolf) via ruby-core" <ruby-core@...>

Issue #19276 has been reported by graywolf (Gray Wolf).

8 messages 2022/12/28

[#111484] [Ruby master Bug#19278] Constructing subclasses of Data with positional arguments — "tenderlovemaking (Aaron Patterson) via ruby-core" <ruby-core@...>

Issue #19278 has been reported by tenderlovemaking (Aaron Patterson).

16 messages 2022/12/28

[#111485] [Ruby master Bug#19279] Allow `Coverage.supported?` to recognize oneshot lines mode — "kevin-j-m (Kevin Murphy) via ruby-core" <ruby-core@...>

SXNzdWUgIzE5Mjc5IGhhcyBiZWVuIHJlcG9ydGVkIGJ5IGtldmluLWotbSAoS2V2aW4gTXVycGh5

7 messages 2022/12/28

[#111526] [Ruby master Bug#19288] Ractor JSON parsing significantly slower than linear parsing — "maciej.mensfeld (Maciej Mensfeld) via ruby-core" <ruby-core@...>

Issue #19288 has been reported by maciej.mensfeld (Maciej Mensfeld).

24 messages 2022/12/30

[#111529] [Ruby master Bug#19289] RbConfig::CONFIG["STRIP"] should keep `rb_abi_version` and `rb_abi_version` should always be part of Ruby — "Eregon (Benoit Daloze) via ruby-core" <ruby-core@...>

Issue #19289 has been reported by Eregon (Benoit Daloze).

8 messages 2022/12/30

[ruby-core:111548] [Ruby master Feature#16986] Anonymous Struct literal

From: "Bumppoman (Brendon Stanton) via ruby-core" <ruby-core@...>
Date: 2022-12-31 01:43:03 UTC
List: ruby-core #111548
Issue #16986 has been updated by Bumppoman (Brendon Stanton).


In a Ruby 3.2 context, I wonder how this would look in the mindset of the new Data class instead of a struct?

----------------------------------------
Feature #16986: Anonymous Struct literal
https://bugs.ruby-lang.org/issues/16986#change-100912

* Author: ko1 (Koichi Sasada)
* Status: Open
* Priority: Normal
* Assignee: matz (Yukihiro Matsumoto)
----------------------------------------
# Abstract

How about introducing anonymous Struct literal such as `${a: 1, b: 2}`?
It is almost the same as `Struct.new(:a, :b).new(1, 2)`.

# Proposal

## Background

In many cases, people use hash objects to represent a set of values such as `person = {name: "ko1", country: 'Japan'}` and access its values through `person[:name]` and so on. It is not easy to write (three characters `[:]`!), and it easily introduces misspelling (`person[:nama]` doesn't raise an error).

If we make a `Struct` object by doing `Person = Struct.new(:name, :age)` and `person = Person.new('ko1', 'Japan')`, we can access its values through `person.name` naturally. However, it costs coding. And in some cases, we don't want to name the class (such as `Person`).

Using `OpenStruct` (`person = OpenStruct.new(name: "ko1", country: "Japan")`), we can access it through `person.name`, but we can extend the fields unintentionally, and the performance is not good.

Of course, we can define a class `Person` with attr_readers. But it takes several lines.

To summarize the needs:

* Easy to write
  * Doesn't require declaring the class
  * Accessible through `person.name` format
* Limited fields
* Better performance

## Idea

Introduce new literal syntax for an anonymous Struct such as: `${ a: 1, b: 2 }`.
Similar to Hash syntax (with labels), but with `$` prefix to distinguish.

Anonymous structs which have the same member in the same order share their class.

```ruby
    s1 = ${a: 1, b: 2, c: 3}
    s2 = ${a: 1, b: 2, c: 3}
    assert s1 == s2

    s3 = ${a: 1, c: 3, b: 2}
    s4 = ${d: 4}

    assert_equal false, s1 == s3
    assert_equal false, s1 == s4
```

## Note

Unlike Hash literal syntax, this proposal only allows `label: expr` notation. No `${**h}` syntax.
This is because if we allow to splat a Hash, it can be a vulnerability by splatting outer-input Hash.

Thanks to this spec, we can specify anonymous Struct classes at compile time.
We don't need to find or create Struct classes at runtime.

## Implementatation

https://github.com/ruby/ruby/pull/3259

# Discussion

## Notation

Matz said he thought about `{|a: 1, b: 2 |}` syntax.

## Performance

Surprisingly, Hash is fast and Struct is slow.

```ruby
Benchmark.driver do |r|
  r.prelude <<~PRELUDE
  st = Struct.new(:a, :b).new(1, 2)
  hs = {a: 1, b: 2}
  class C
    attr_reader :a, :b
    def initialize() = (@a = 1; @b = 2)
  end
  ob = C.new
  PRELUDE
  r.report "ob.a"
  r.report "hs[:a]"
  r.report "st.a"
end
__END__
Warming up --------------------------------------
                ob.a    38.100M i/s -     38.142M times in 1.001101s (26.25ns/i, 76clocks/i)
              hs[:a]    37.845M i/s -     38.037M times in 1.005051s (26.42ns/i, 76clocks/i)
                st.a    33.348M i/s -     33.612M times in 1.007904s (29.99ns/i, 87clocks/i)
Calculating -------------------------------------
                ob.a    87.917M i/s -    114.300M times in 1.300085s (11.37ns/i, 33clocks/i)
              hs[:a]    85.504M i/s -    113.536M times in 1.327850s (11.70ns/i, 33clocks/i)
                st.a    61.337M i/s -    100.045M times in 1.631064s (16.30ns/i, 47clocks/i)
Comparison:
                ob.a:  87917391.4 i/s
              hs[:a]:  85503703.6 i/s - 1.03x  slower
                st.a:  61337463.3 i/s - 1.43x  slower
```

I believe we can speed up `Struct` similarly to ivar accesses, so we can improve the performance.


BTW, OpenStruct (os.a) is slow.

```
Comparison:
              hs[:a]:  92835317.7 i/s
                ob.a:  85865849.5 i/s - 1.08x  slower
                st.a:  53480417.5 i/s - 1.74x  slower
                os.a:  12541267.7 i/s - 7.40x  slower
```


For memory consumption, `Struct` is more lightweight because we don't need to keep the key names.

## Naming

If we name an anonymous class, literals with the same members share the name.

```ruby
s1 = ${a:1}
s2 = ${a:2}
p [s1, s2] #=> [#<struct a=1>, #<struct a=2>]
A = s1.class
p [s1, s2] #=> [#<struct A a=1>, #<struct A a=2>]

```

Maybe that is not a good behavior.




-- 
https://bugs.ruby-lang.org/
 ______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/postorius/lists/ruby-core.ml.ruby-lang.org/

In This Thread