This was a conscious design decision on Data implementaion, that underlines its nature.
Struct has a two-fold nature: it is both "a mutable structured object" and "a container" (has #[], #each, includes Enumerable).
Data is a base for composite value objects; so in designing it, the focus was on other composite value objects in Ruby, like Time. We don't have Time.now.dig(:year) and things like that, making a distinction between "navigable containers" and "atomic value objects". If Data-based class used in some context as a base of a container-like object, the implementation of #dig is relatively trivial:
class Locations < Data.define(:work, :home, :shelter)
def dig(first, *rest)
return unless members.include?(first)
send(first).then { rest.empty? ? it : it.dig(*rest) }
end
end