Why default_attributes not being merged with passed attributes in Dry::Struct?

Hi!

Recently I started using Dry::Struct and face weird behaviour for example with class:

class MyStruct < Dry::Struct
  attribute :qwe, Types::String.default('qwe')
  attribute :data do
    attribute? :foo, Types::Bool.default(false)
    attribute :bar, Types::Array.default([].freeze)
  end
end

And here is confusion on initialize:

MyStruct.new => # {qwe: 'qwe',data: {foo: false, bar: []}}
MyStruct.new(qwe: 'asd') => # {qwe: 'asd', data: nil}

Digging code founded that default_attributes are being used only when no attributes passed.

Is it intended?
Why not just simple merge?

Performance impact would be the first answer.
I’m not sure why MyStruct.new even works, in my understanding it shouldn’t. Besides, combining attribute? with .default is a no-op. Finally, structs defined with inline syntax cannot be made default, the right way would be

class MyStruct < Dry::Struct
  attribute :qwe, Types::String.default('qwe')
  class Data < Dry::Struct
    attribute :foo, Types::Bool.default(false)
    attribute :bar, Types::Array.default([].freeze)
  end
  attribute :data, Data.default { Data.new }
end

Got it, thank you!