ああ、分かった。% は、sprintf の syntax suger みたいなものらしいね。

でも、この場合、p.to_a は、本当は良くないと思うよ。
なぜなら、そもそも構造体自体が、「並び方」に依存しないプログラムを
作るために用いるものなのに、その目的に逆行してしまうから。

to_a だと、構造体を定義したときにメンバが並んでいる順に配列のように
取り出してしまう。ところが、構造体は、そういう順序に依存するプログラム
に問題がおきやすいから導入するもんなんだよ、これが。