言葉を覚えさせる

Last-modified: 2018-04-30 (月) 12:29:29

原型

キーボードから入力した内容を「言葉」=>「意味」でハッシュで保存します。
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.rb
     require "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のいずれかを返す。)。