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"