Project

General

Profile

Actions

Feature #18573

open

Object#pack1

Added by os (Shigeki OHARA) 6 months ago. Updated 6 months ago.

Status:
Open
Priority:
Normal
Assignee:
-
Target version:
-
[ruby-dev:51154]

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) 6 months ago

packしたいもの(のclass)はすごく限定的なので、Objectに生やすのはどうかなあと思いました。

Updated by knu (Akinori MUSHA) 6 months ago

String#format / String#% のような感じで書式の方をレシーバにする方がよさそうですが、unpackとの対称性を考えると名前が難しいかも。

Updated by knu (Akinori MUSHA) 6 months ago

今日のOffice Hourで話したんですが、レシーバごとにそれにふさわしい書式って限定されるはずなので、何でも屋のpackではなく、たとえばIntegerならビット幅とエンディアンを指定してバイナリ表現を得るメソッド、StringならNUL-terminatedなバイナリを得るメソッド、などをそれぞれ用意すべきかも、と思いました。

Updated by byroot (Jean Boussier) 6 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).

Actions

Also available in: Atom PDF