[ruby-list:46866] Re: []= メソッドの第一引数を省略したい

From: 西 啓一朗 <receiver@...>
Date: 2010-02-18 23:05:07 UTC
List: ruby-list #46866
ちょっとだけツッコミ

>   def []=(key,val=nil)
>     if val.nil?
>       self.push(key)
>     else
>       super(key,val)
>     end
>   end
> end

これだと、

> arr = MyArray.new
> arr[] = 1 # => 1
> arr[] = 2 # => 2
> arr # => [1, 2]

arr[0] = nil # => 0
arr #=> [1, 2, 0]

と意図しない動作になると思います。
デフォルト値ではなく可変長引数を使って

def []=(key, *val)
  if val.empty?
    self.push key
  else
    super(key, *val)
  end
end

とした方が良いと思います。

> ここの部分はちょっと不思議ですね。
> てっきり key.nil? を見るべきだと思っていたので。
> このような仕様にした意図が気になるところです。

メソッドの呼び出しに置き換えてみればわかりやすいかと。
値が省略されるというのは文字通り「何も書かない」以外では表記できません。

arr[3] = "test" # => arr.[]=(3, "test")
arr[nil] = 12 #=> arr.[]=(nil, "test")
arr[] = 5 #=> arr.[]=(5)

-- 
西 啓一朗 <ktouth@k-brand.gr.jp>


In This Thread

Prev Next