SVX日記
2024-03-04(Mon) pack/unpackをよりどうにかする
たわむれは、おわり、のはずだったが、美作にいけてしまった(?)ので、もうちっとだけ続くんじゃ。以下は前回のコードだが。
:c_ << 'ABC'
=> [65, 66, 67]
[:c_] << 'ABC' # 動くけど……
=> [65, 66, 67]
class Array
def <(packed)
packed.unpack(self[0].to_s.sub(/_$/, '*'))
end
end
「<」の元来の意味は「より小さい」だが、「<<」の元来の意味だって「左シフト」なのに、Rubyオフィシャルに「左に追加」の意味で使っているのだから、「<」を「左に渡す」の意味で使ったって構わんだろう。
class String
alias :perc :%
def %(arg)
self =~ /^:(.+)/ ? arg.pack($1.sub(/_$/, '*')) : perc(arg)
end
end
class Array
def <(packed)
packed.unpack(self[0].to_s.sub(/_$/, '*'))
end
end
':c_' % [65, 66, 67]
=> "ABC"
[:c_] < 'ABC'
=> [65, 66, 67]
':m_' % ['ABCDE']
=> "QUJDREU=\n"
[:m_] < 'QUJDREU='
=> ["ABCDE"]