Skip to content

Commit 8d6a531

Browse files
committed
[GR-40333] Ruby 3.1 Add Struct.new.keyword_init?
PullRequest: truffleruby/3702
2 parents 7cbac45 + c7312f5 commit 8d6a531

File tree

6 files changed

+26
-6
lines changed

6 files changed

+26
-6
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ Compatibility:
9292
* Add `Process._fork` (#2733, @horakivo).
9393
* Update to JCodings 1.0.58 and Joni 2.1.44 (@eregon).
9494
* Add `MatchData#match` and `MatchData#match_length` (#2733, @horakivo).
95+
* Add `StructClass#keyword_init?` method (#2377, @moste00).
9596

9697
Performance:
9798

spec/ruby/core/struct/keyword_init_spec.rb

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,24 @@
1717
struct = Struct.new(:arg)
1818
struct.keyword_init?.should be_nil
1919
end
20+
21+
it "returns nil for a struct that does specify keyword_init to be nil" do
22+
struct = Struct.new(:arg, keyword_init: nil)
23+
struct.keyword_init?.should be_nil
24+
end
25+
26+
it "returns true for any truthy value, not just for true" do
27+
struct = Struct.new(:arg, keyword_init: 1)
28+
struct.keyword_init?.should be_true
29+
30+
struct = Struct.new(:arg, keyword_init: "")
31+
struct.keyword_init?.should be_true
32+
33+
struct = Struct.new(:arg, keyword_init: [])
34+
struct.keyword_init?.should be_true
35+
36+
struct = Struct.new(:arg, keyword_init: {})
37+
struct.keyword_init?.should be_true
38+
end
2039
end
2140
end

spec/tags/core/struct/keyword_init_tags.txt

Lines changed: 0 additions & 3 deletions
This file was deleted.

src/main/ruby/truffleruby/core/struct.rb

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class << self
3333
alias_method :subclass_new, :new
3434
end
3535

36-
def self.new(klass_name, *attrs, keyword_init: false, &block)
36+
def self.new(klass_name, *attrs, keyword_init: nil, &block)
3737
if klass_name
3838
if Primitive.object_kind_of?(klass_name, Symbol) # Truffle: added to avoid exception and match MRI
3939
attrs.unshift klass_name
@@ -92,6 +92,11 @@ def self.inspect
9292

9393
const_set :STRUCT_ATTRS, attrs
9494
const_set :KEYWORD_INIT, keyword_init
95+
96+
def self.keyword_init?
97+
return nil if Primitive.nil?(self::KEYWORD_INIT)
98+
Primitive.as_boolean(self::KEYWORD_INIT)
99+
end
95100
end
96101

97102
const_set klass_name, klass if klass_name

test/mri/excludes/TestStruct/SubStruct.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,3 @@
55
exclude :test_struct_new_with_empty_hash, "needs investigation"
66
exclude :test_parameters, "<[[:req, :_]]> expected but was"
77
exclude :test_keyword_args_warning, "<{:a=>1}> expected but was"
8-
exclude :test_struct_keyword_init_p, "NoMethodError: undefined method `keyword_init?' for #<Class:0x6bf8>(keyword_init: true)"

test/mri/excludes/TestStruct/TopStruct.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,5 @@
33
exclude :test_nonascii, "needs investigation"
44
exclude :test_redefinition_warning, "needs investigation"
55
exclude :test_struct_new_with_empty_hash, "needs investigation"
6-
exclude :test_struct_keyword_init_p, "NoMethodError: undefined method `keyword_init?' for #<Class:0xc3f888>(keyword_init: true)"
76
exclude :test_parameters, "<[[:req, :_]]> expected but was"
87
exclude :test_keyword_args_warning, "expected: /warning: Passing only keyword arguments to Struct#initialize will behave differently from Ruby 3\\.2\\./"

0 commit comments

Comments
 (0)