Hash 配列の中に hash 配列を入れることも可能である。
key_1 といえば value_1 value_1 を key_2 とし、key_2 といえば value_2 value_2 を key_3 とし、key_3 といえば value_3 :
わらしべ長者という昔話がある。
貧乏な男が転んだ。 転んだらわらをつかんだ。 アブが飛んできた。 アブがうるさいのでわらにくくりつけた。 わらにくくるとおもちゃになった。 おもちゃになったわらを持って歩いた。 泣いている赤ん坊が欲しがった。 赤ん坊は泣きやんだ。 泣きやんだ礼としてみかんをもらった。 喉の喝いた旅人がみかんを欲しがった。 喉をうるおした礼として反物をもらった。 侍が倒れた馬と反物を交換したがった。 反物と倒れた馬を交換した。 倒れた馬を休ませた。 馬は元気になった。 元気な馬を欲しがる庄屋がいた。 庄屋は旅に出た。 庄屋は旅に出るため屋敷の留守を頼んだ。 庄屋は戻って来なかった。 貧乏な男は庄屋になった。
一つの出来事に対して一つの出来事が発生している。 数学の証明に使う三段論法もこの方法である。 また、数学の証明などによく使われる三段論法もこのパターンである。
「人間は皆死ぬ。ソクラテスは人間である。故にソクラテスは死ぬ。」
まず、大前提、小前提、最後に結論が来る。hash で表すと、
{人間 => 死ぬ, ソクラテス => 人間}
よって、"人間"が 2 つあるので、これらをつなげて、
{ソクラテス => 死ぬ}
となる。これをプログラムにしてみよう。 socrates.rb
#!/usr/koeki/bin/ruby
premise = Hash.new # 前提を代入する Hash 配列
subject = "人間"
object = "いつか死ぬ"
premise[subject] = object # 大前提
subject2 = "ソクラテス"
object2 = "人間" # 小前提
premise[subject2] = object2
if premise.value?(subject) == true
printf("%sは%s\n",subject,premise[subject])
printf("%sは%s\n",subject2,premise[subject2])
printf("ゆえに%sは%s\n", subject2,premise[subject])
end
同じ文字列が key と value にあるかどうか調べている。
# hash配列.key?("文字列") # key に "文字列" が存在するかどうか # hash配列.values?("文字列") # value に "文字列" が存在するかどうか # # 存在すれば true, しなければ false を返す本日の講義 / 基礎プログラミング II / 2007 年度 Madoka Nishimura <madoka@e.koeki-u.ac.jp>