title: args_to_hash
author: KUMAGAI Hidetake
mailto: ggb03124@nifty.ne.jp

1. args_to_hash メソッド

　メソッドの仮引数で「*args」の形式で受け取った引数の配列をハッシュに変換する。

--ruby
書式：
  args_to_hash(args_array,key_array) : Hash
例：
  hash = args_to_hash(args,[:arg1, :arg2, :arg3])
--

　第1引数はハッシュにしたい配列。
　第2引数はハッシュのキーの配列。配列の要素はシンボル、もしくはシンボルをキーとした要素数1のハッシュ。

　配列にキーを割り当てる方法には次の3つの方法がある。

（1）順番だけで決める方法
（2）実引数をハッシュ形式で指定する方法
（3）仮引数でクラスを指定する方法
（4）シンボルを指定する方法

1.1. 順番だけで決める方法

--ruby
#! ruby -Ks
require "args_to_hash"

def test(*args)
  hash = args_to_hash(args,[
    :arg1,
    :arg2,
    :arg3,
  ])
  return hash
end

p test(1,"two",3.0)

  #=> {:arg1=>1, :arg2=>"two", :arg3=>3.0}

#-- 少ない場合

p test(1,"two")

  #=> {:arg1=>1, :arg2=>"two"}

#-- 多い場合

p test(1,"two",3.0,4444)

  #=> unknown arg '4444' (ArgumentError)
--

1.1. 実引数をハッシュ形式で指定する方法

--ruby
#! ruby -Ks
require "args_to_hash"

def test(*args)
  hash = args_to_hash(args,[
    :arg1,
    :arg2,
    :arg3,
  ])
  return hash
end

p test({:arg2=>1},{:arg3=>"two"})

  #=> {:arg2=>1, :arg3=>"two"}
--

1.1. 注意：ハッシュを引数の値として送りたい場合

　引数が（A）ハッシュであり、（B）ハッシュの要素が一つで、（C）キーがシンボルの場合すべてを満たす場合には「実引数をハッシュ形式で指定する方法」と見なされる。
　従って、その形式のハッシュを引数として送りたい場合には、送りたいハッシュを「実引数をハッシュ形式で指定する方法」の《値》として指定する必要がある。
　たとえば、「{:key1=>333}」という値を引数として送りたいのであれば「{:arg3=>{:key1=>333}}」とする。

--ruby
#! ruby -Ks
require "args_to_hash"

def test(*args)
  hash = args_to_hash(args,[
    :arg1,
    :arg2,
    :arg3,
  ])
  return hash
end

p test(1,"two",{:arg3=>{:key1=>333}})

  #=> {:arg1=>1, :arg2=>"two", :arg3=>{:key1=>333}}

#-- 単純に指定すると、args用のキーと見なされる。

p test(1,"two",{:key1=>3333})

  #=> unknown arg '{:key1=>3333}' (ArgumentError)
--

1.1. 仮引数でクラスを指定する方法

--ruby
#! ruby -Ks
require "args_to_hash"

def test(*args)
  hash = args_to_hash(args,[
    {:arg1 => String},
    {:arg2 => Float},
    {:arg3 => Integer},
  ])
  return hash
end

p test(1,"two",3.0)

  #=> {:arg1=>"two", :arg2=>3.0, :arg3=>1}
--

1.1. シンボルを指定する方法

　指定されたシンボル（:arg3）と同じ名前を引数に送った場合には、{:arg3=>true}とほぼ同じ扱いになります。
　シンボルがtrue/falseを受け入れないクラスに指定している場合には、エラーになります。
　指定されていないシンボルの場合には通常の引数として扱われます。

--ruby
#! ruby -Ks
require "args_to_hash"

def test(*args)
  hash = args_to_hash(args,[
     :arg1,
    {:arg2 => Float},
     :arg3,
  ])
  return hash
end

p test(:arg3,"two",3.0)

  #=> {:arg1=>"two", :arg2=>3.0, :arg3=>true}

p test({:arg3=>true},"two",3.0)

  #=> {:arg1=>"two", :arg2=>3.0, :arg3=>true}

# 2003-03-04(火) 停止中
# p test(:arg2,"two",3.0)
#
#  #=> ':arg2' must have a Float (ArgumentError)
--

1. test(111,:arg2=>1,:arg3=>"two") という書き方

引数の後半がすべてハッシュ型である場合には簡易な書き方ができるらしい。

ハッシュ型が始まった後に、ハッシュ型以外の引数を置くと、エラーになる。

ハッシュ型の列は、一つのハッシュとして仮引き数に引き渡される。

ということらしい。このタイプの引数には、まだ、対応していない。2003-02-13(木)

1. ログ

2003-03-07(金) 型指定があっても、nilは通すことにした。
2003-03-04(火) オプションを全部消化しない場合でも例外を生成しないようにした。次のメソッドへ渡す場合がある。

1. todo

2003-05-26(月)：消化しなかったargsを返すべきではないか？ opt,rest=args_to_hash(……)
2003-05-26(月)：一つのハッシュに複数の項目がある場合に対処すべきか？
2003-03-04(火)： :eat オプション、:raiseオプションを追加すべきか？

1. 仕様について

Ａ案：順番に調べていって、取り込めないデータがあったら中止して、restとして返す。restがなければrest=nil。

1.1. 基本的な引数仕様は？

Ruby一般の引数の基本仕様は 直データの配列。
args_to_hashでの引数の基本仕様はハッシュ形式{:arg_name1=>argv1}


1. ユースケース

??
