[#15625] rb_hash_initialize — Takaaki Tateishi <ttate@...>

立石です.

22 messages 2002/01/04
[#15627] Re: rb_hash_initialize — matz@... (Yukihiro Matsumoto) 2002/01/04

まつもと ゆきひろです

[#15628] Re: rb_hash_initialize — Takaaki Tateishi <ttate@...> 2002/01/04

立石です.

[#15685] undefined method `inherited' for false (NameError) — WATANABE Hirofumi <eban@...>

わたなべです。

13 messages 2002/01/15
[#15686] Re: undefined method `inherited' for false (NameError) — nobu.nakada@... 2002/01/15

なかだです。

[#15757] 文字列→整数変換 — nobu.nakada@...

なかだです。

30 messages 2002/01/25

[#15830] [ 提案 ] puts, print 等を IO から分離 — UENO Katsuhiro <unnie@...>

うえのです。

14 messages 2002/01/31

[ruby-dev:15632] Re: rb_hash_initialize

From: matz@... (Yukihiro Matsumoto)
Date: 2002-01-04 18:48:49 UTC
List: ruby-dev #15632
まつもと ゆきひろです

In message "[ruby-dev:15628] Re: rb_hash_initialize"
    on 02/01/05, Takaaki Tateishi <ttate@kt.jaist.ac.jp> writes:

|> これって具体的にはなにを意味するんでしょうか?
|
|例えば,
|
|  hash = Hash.new{|h,key| h[key] = key[0] + key[1]}
|
|としたときに,
|
|  hash[1,2]
|  # => 3
|
|とできるといいなと思っていました.

まず第一に、Hash#[]に複数の値を指定することについては、Array
やStringと(Collectionとしての性質が似ているのに)意味が変化し
てしまうので躊躇しています。

たとえば、

  h = {1=>2, 2=>4, 3=>6, 4=>8}
  h[1,3,4] => [2,6,8]

とかの意味をもってほしいと思う人もいるでしょうし、違う意味で
とらえる人もいるでしょう。結局混乱のもとのように感じます。

第二に、立石さんの望みである

|単純に,Proc,Methodと同じように扱いたかったというだけです.

というのが全然理解できません。HashとProcになんの関連性がある
のでしょうか? HashがProcのようにcallに反応してなんの嬉しい
点があるのか理解できません。一方、callを与えることにより、単
なるデフォルト値の計算方法のひとつにしかすぎないHashのブロッ
クに必要以上の意味を与えることにはデメリットだと思います。

実際にはデフォルト値の計算にinitializeに与えたブロックを使う
というのは Hash#default メソッドの振る舞いに過ぎませんし、
defaultメソッドをオーバーライドすれば変化してしまう挙動です。

|Hash#call というのも Hash の意味からはずれてしまう気もしますが,
|実行結果をキャッシュするという使われ方をする場合には,call があ
|る方が良い気がします.

えー、どうして? なんでHashにcallが?

|ところで,初期化のためのブロックは,Hashオブジェクト自身も引数
|にとり,
|
|  Hash.new{|h,key| h[key] = key + 1}
|
|としますが,
|
|  Hash.new{|key| key + 1}
|
|としなかったのは,他のキーに対する値を変更できるという理由からで
|しょうか?

ブロックからHash自身をえる確実な方法がほかにないからです。

                                まつもと ゆきひろ /:|)

In This Thread