原型
キーボードから入力した内容を「言葉」=>「意味」でハッシュで保存します。
dictionary.rb
#### dictionaryはハッシュである事を示す
dictionary={}
name=gets.chomp mean=gets.chomp
dictionary[name]=mean
dictionary.each do |c_word,word| puts c_word + " : " + word end
進化系
対話風にして、最後に外部ファイル(dictionary.txt)に保存します。
あらかじめ、dictionary.txt というファイル(中身は空でよい)を作っておきます。
dictionary_2.rb
#### dictionaryはハッシュである事を示す
dictionary={}
puts "何か言葉を教えて。" print "単語>" name=gets.chomp print "意味>" mean=gets.chomp puts "「" + name + "」とは「" + mean + "」と言う意味なのね。覚えたわ。"
dictionary[name]=mean
#### ファイルに保存する
dictionary.each do |c_word,word|
File.open("dictionary.txt","a") do |dict|
dict.puts c_word + "," + word
end
end
YAMLを使ったら簡単になった
記憶用外部ファイルをただのテキストファイルからYAMLというものに変えました。
YAMLファイルも実体はテキストなのですが、独自の記述法により、プログラムが読み込んだときに、配列は配列として、ハッシュはハッシュとして、それ以外のものはそれなりに認識してくれるスグレモノです。
dictionary_yaml.rb
require "yaml"
#### dictionary.yamlを一旦読み込み、dictionaryに格納 dictionary=YAML.load_file"dictionary.yaml"
puts "何か言葉を教えて。" print "単語>" name=gets.chomp print "意味>" mean=gets.chomp puts "「" + name + "」とは「" + mean + "」と言う意味なのね。覚えたわ。"
#### dictionaryに追加(既にある言葉の場合は更新) dictionary[name]=mean
#### dictionary.yamlに上書き保存
YAML.dump(dictionary,File.open("dictionary.yaml", "w"))
おそらく、このままだと有効なdictionary.yamlがないためエラーになります。対策は次の修正版で。
- 最初に require "yaml" と記述して、RubyにYAMLを使うことを教えてあげる必要があります。
- なぜdictionary.yamlを一旦読み込み、dictionaryに格納するかというと、最終行でdictionary.yamlに追記すると、別のハッシュとして書き込んでしまうからです。
--- バス: たくさんの人を乗せられる自動車 --- 月: 冷酷な女教師 --- パソコン: 人をダメにする箱
このように、間に --- が挟まると、別のハッシュとして認識してしまう。
クラスにしてみる
ここでやったこと
- もしかしたら後で楽になるかも知れないので、クラスにしてみました。
- 変数はインスタンス変数にしました。
learning.rbrequire "yaml"
class Learning
def initialize
begin
@dictionary=YAML.load_file"dictionary.yaml"
rescue
@dictionary={}
end
end
def ask
puts "何か言葉を教えて。"
print "単語>"
@word=gets.chomp
print "意味>"
@mean=gets.chomp
puts "「" + @word + "」とは「" + @mean + "」という意味なのね。覚えたわ。"
@dictionary[@word]=@mean
YAML.dump(@dictionary,File.open("dictionary.yaml", "w"))
end
end
learn=Learning.new learn.ask
はじめてこのプログラムを実行するときには、まだdictionary.yamlファイルが存在していないので、「begin~rescue~end」で例外処理するようにしてあります。
「しりとり」に出てきた言葉の意味を聞くようにする
「しりとり」にでてきた言葉の意味を聞くようにします。
shiritori_learning.rb
require "yaml"
class Shiritori_Learning
def initialize
begin
@dictionary=YAML.load_file"dictionary.yaml"
rescue
@dictionary={}
end
begin
@pc_wordsbank=YAML.load_file"wordsbank.yaml"
rescue
puts ("嫁>まだしりとりやったことないから、言葉を知らないの。")
exit
end
end
def ask
#### しりとりデータベースからランダムに言葉を取り出す。
select=rand(@pc_wordsbank.size)
puts "「" + @pc_wordsbank[select] + "」てどういう意味なの?"
print "単語>"
@word=gets.chomp
print "意味>"
@mean=gets.chomp
puts "「" + @word + "」とは「" + @mean + "」という意味なのね。覚えたわ。"
@dictionary[@word]=@mean
YAML.dump(@dictionary,File.open("dictionary.yaml", "w"))
end
end
shiritori_learning=Shiritori_Learning.new shiritori_learning.ask
- 配列の長さ(要素数)を求めるのは、pc_wordsbank.size でも pc_wordsbank.length でもよい。
- rand は0から引数で渡した数の一つ前までの数字をランダムに返す(rand(3)なら、0,1,2のいずれかを返す。)。