Feature #18573
openObject#pack1
Description
概要¶
String#unpack1 の逆の Object#pack1 が欲しい。
背景¶
Array#pack というメソッドがありますが、レシーバーの Array の要素数が 1 つしかないことが良くあります。
[codepoint].pack('U')
[digest].pack('m0')
[mail_body].pack('M')
[ip_address].pack('N')
標準添付ライブラリーなどを眺めてみてもチラホラあるようです。
ですが、このようなケースで変換対象のオブジェクトをわざわざ Array でくるまなくてはいけないというのは面倒な気もします。
提案¶
String#unpack に対して String#unpack1 というメソッドがありますが、
Array#pack に対する Object#pack1 というメソッドを提案します。
イメージとしては以下のコードのような感じです。
class Object
def pack1(template, option = {})
[self].pack(template, **option)
end
end
議論・課題¶
- Object で良いかどうかは議論の余地があろうかと思います
- メソッド名が pack1 で良いかはわかりませんが、他とかぶる可能性は低いかと思います
Updated by knu (Akinori MUSHA) 12 months ago
packしたいもの(のclass)はすごく限定的なので、Objectに生やすのはどうかなあと思いました。
Updated by knu (Akinori MUSHA) 12 months ago
String#format / String#% のような感じで書式の方をレシーバにする方がよさそうですが、unpackとの対称性を考えると名前が難しいかも。
Updated by knu (Akinori MUSHA) 12 months ago
今日のOffice Hourで話したんですが、レシーバごとにそれにふさわしい書式って限定されるはずなので、何でも屋のpackではなく、たとえばIntegerならビット幅とエンディアンを指定してバイナリ表現を得るメソッド、StringならNUL-terminatedなバイナリを得るメソッド、などをそれぞれ用意すべきかも、と思いました。
Updated by byroot (Jean Boussier) 12 months ago
(using Google Translate to understand the discussion, sorry if I misunderstood or missed things).
Since Object#pack1
might be deemed a bit too invasive, an alternative could be String.pack1(format, arg)
, or even String.pack(format, *args)
.