diff --git a/struct.c b/struct.c
index 825987917d..38c780dcda 100644
--- a/struct.c
+++ b/struct.c
@@ -524,8 +524,7 @@ rb_struct_define_under(VALUE outer, const char *name, ...)
*
* - May be anonymous, or may have the name given by +class_name+.
* - May have members as given by +member_names+.
- * - May have initialization via ordinary arguments (unless
- * keyword_init: true is given), or via keyword arguments
+ * - May have initialization via ordinary arguments, or via keyword arguments
*
* The new subclass has its own method ::new; thus:
*
@@ -594,6 +593,12 @@ rb_struct_define_under(VALUE outer, const char *name, ...)
* Foo.new(0, 1) # => #
* Foo.new(0, 1, 2) # Raises ArgumentError: struct size differs
*
+ * # Initialization with keyword arguments:
+ * Foo.new(foo: 0) # => #
+ * Foo.new(foo: 0, bar: 1) # => #
+ * Foo.new(foo: 0, bar: 1, baz: 2)
+ * # Raises ArgumentError: unknown keywords: baz
+ *
* \Method ::[] is an alias for method ::new.
*
* - \Method :inspect returns a string representation of the subclass:
@@ -608,20 +613,30 @@ rb_struct_define_under(VALUE outer, const char *name, ...)
* Keyword Argument
*
* By default, the arguments for initializing an instance of the new subclass
- * are ordinary arguments (not keyword arguments).
- * With optional keyword argument keyword_init: true,
- * the new subclass must be initialized with keyword arguments:
+ * can be both positional and keyword arguments.
*
- * # Without keyword_init: true.
- * Foo = Struct.new('Foo', :foo, :bar)
- * Foo # => Struct::Foo
- * Foo.new(0, 1) # => #
- * # With keyword_init: true.
- * Bar = Struct.new(:foo, :bar, keyword_init: true)
- * Bar # => # => Bar(keyword_init: true)
- * Bar.new(bar: 1, foo: 0) # => #
- * Bar.new(0, 1) # Raises ArgumentError: wrong number of arguments
+ * Optional keyword argument keyword_init: allows to force only one
+ * type of arguments to be accepted:
*
+ * KeywordsOnly = Struct.new(:foo, :bar, keyword_init: true)
+ * KeywordsOnly.new(bar: 1, foo: 0)
+ * # => #
+ * KeywordsOnly.new(0, 1)
+ * # Raises ArgumentError: wrong number of arguments
+ *
+ * PositionalOnly = Struct.new(:foo, :bar, keyword_init: false)
+ * PositionalOnly.new(0, 1)
+ * # => #
+ * PositionalOnly.new(bar: 1, foo: 0)
+ * # => #1, :bar=>2}, bar=nil>
+ * # Note that no error is raised, but arguments treated as one hash value
+ *
+ * # Same as not providing keyword_init:
+ * Any = Struct.new(:foo, :bar, keyword_init: nil)
+ * Any.new(foo: 1, bar: 2)
+ * # => #
+ * Any.new(1, 2)
+ * # => #
*/
static VALUE