You are right, this works when the self is explicit on the assignment.  It's also very POLS.  I like it!

Dog = Struct.new(:bark, :bite) do
  def initialize(*args)
    super(*args)
    self.bark = "really loud" unless bark
  end
end

Thanks for the heads up!