Skip to content

Commit 06f8a02

Browse files
committed
Ensure keyword arguments for Concurrent::*Struct behave similarly to Std-lib Struct
1 parent 4e0b166 commit 06f8a02

File tree

2 files changed

+15
-4
lines changed

2 files changed

+15
-4
lines changed

lib/concurrent/synchronization/abstract_struct.rb

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,14 @@ def self.define_struct_class(parent, base, name, members, kw_args, &block)
142142
self.const_set(:MEMBERS, members.collect{|member| member.to_s.to_sym}.freeze)
143143
self.const_set(:KEYWORD_INIT, !!kw_args[:keyword_init])
144144
def ns_initialize(*values, **kw_values)
145-
raise ArgumentError.new('struct size differs') if values.length > length || kw_values.length > length
146-
@values = keyword_init? ? members.map{ |val| kw_values.fetch(val, nil) } : values.fill(nil, values.length..length-1)
145+
@values = if keyword_init?
146+
key_diff = kw_values.keys - members
147+
raise ArgumentError.new("unknown keywords: #{key_diff.join(',')}") unless key_diff.empty?
148+
members.map {|val| kw_values.fetch(val, nil)}
149+
else
150+
raise ArgumentError.new('struct size differs') if values.length > length
151+
values.fill(nil, values.length..length-1)
152+
end
147153
end
148154
end
149155
unless name.nil?

spec/concurrent/struct_shared.rb

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,13 @@ def baz(foo, bar) foo + bar; end
101101

102102
it 'raises an exception when extra members are given' do
103103
classes.each do |clazz|
104-
extra_values = values << 'forty two'
105-
expect{ clazz.new(*extra_values) }.to raise_error(ArgumentError)
104+
if clazz::KEYWORD_INIT
105+
extra_values = kw_values.merge({FortyTwo: 'forty two'})
106+
expect{ clazz.new(**extra_values) }.to raise_error(ArgumentError)
107+
else
108+
extra_values = values << 'forty two'
109+
expect{ clazz.new(*extra_values) }.to raise_error(ArgumentError)
110+
end
106111
end
107112
end
108113
end

0 commit comments

Comments
 (0)