Project

General

Profile

Actions

Bug #19301

closed

Fix Data class to report keyrest instead of rest parameters

Added by bkuhlmann (Brooke Kuhlmann) almost 2 years ago. Updated almost 2 years ago.

Status:
Rejected
Assignee:
-
Target version:
-
ruby -v:
ruby 3.2.0 (2022-12-25 revision a528908271) [arm64-darwin22.2.0]
[ruby-core:111581]

Description

Overview

Hello and Happy New Year. 👋

With the new Data class, I'm seeing a discrepancy in parameter behavior compared to a Struct. I understand the original Data feature request made design choices to only accept keyword arguments for the #initialize method but reporting [[rest]] parameters seems misleading to me because it doesn't share the more flexible Struct#initialize behavior and would like to request Data#initialize answer [[keyrest]] for parameters for improved metaprogramming accuracy.

Steps to Recreate

To reproduce, consider the following:

DataExample = Data.define :one, :two
StructExample = Struct.new :one, :two

argument_array = [one: 1, two: 2]
argument_hash = {one: 1, two: 2}

puts "Data (parameters):        #{DataExample.method(:initialize).parameters}"
puts "Struct (parameters):      #{StructExample.method(:initialize).parameters}"
puts "Data (argument hash):     #{DataExample[**argument_hash]}"
puts "Struct (argument array):  #{StructExample[*argument_array]}"
puts "Struct (argument hash):   #{StructExample[**argument_hash]}"

The above will output the following:

Data (parameters):        [[:rest]]
Struct (parameters):      [[:rest]]
Data (argument hash):     #<data DataExample one=1, two=2>
Struct (argument array):  #<struct StructExample one={:one=>1, :two=>2}, two=nil>
Struct (argument hash):   #<struct StructExample one=1, two=2>

The Struct class -- as far as I know -- has always reported [[rest]] parameters even though it can accept positional or keyword arguments without error. ...but this is definitely not the case with the Data class which can be seen when running the following modification to the above:

DemoExample[*argument_array]
# missing keyword: :two (ArgumentError)

The above clearly betrays the [[rest]] parameters response (granted a Struct is slightly devious too but at least happily accepts positional or keyword arguments). With this in mind, could Data#initalize be fixed to at least report [[keyrest]] so we'd have a better chance of metaprogramming the correct argument format based on the #parameters response for initializing a Data instance correctly?

Thanks. 🙇🏻‍♂️

Environment

ruby 3.2.0 (2022-12-25 revision a528908271) [arm64-darwin22.2.0]


Related issues 2 (0 open2 closed)

Related to Ruby master - Bug #19280: Wrong error message about arity of Data::define.newClosedActions
Related to Ruby master - Bug #19278: Constructing subclasses of Data with positional argumentsRejectedActions
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0