SVX日記
2024-03-03(Sun) pack/unpackをどうにかする
昨日、pack/unpackって記述方法としてはどうなのよ、と書いてから、なんだか考え始めてしまった。要するに、以下の書き方が全然ピンとこないのでちっとも覚えられない、って話である。
[65, 66, 67].pack('c*')
=> ABC'ABC'.unpack('c*')
=> [65, 66, 67]'%c%c%c' % [65, 66, 67]
=> ABC「%」演算子を使っているのがミソだ。「文字列化する」「引数は配列」というイメージが自然に湧く。じゃ、逆に「配列化する」演算子はなんだ? 苦し紛れだが、こんなのはどうだ。こんな文法はないので動かないが。
'%c%c%c' << 'ABC' # 動きません
=> [65, 66, 67]:c_ << 'ABC'
=> [65, 66, 67]class Symbol
    def <<(packed)
        packed.unpack(self.to_s.sub(/_$/, '*'))
    end
end:m_ << 'QUJDREU='
=> ["ABCDE"]'%m' % ['ABCDE'] # 動きません
=> "QUJDREU=\n"class String
    alias :perc :%
    def %(arg)
        self =~ /^:(.+)/ ? arg.pack($1.sub(/_$/, '*')) : perc(arg)
    end
end':m_' % ['ABCDE']
=> "QUJDREU=\n"['ABCDE'].pack('m*')
=> "QUJDREU=\n"'QUJDREU='.unpack('m*')[0]
=> "ABCDE"[ツッコミを入れる]