2014年4月26日土曜日

[Ruby]雑談対話2 OpenStructを使ってみました

雑談対話をRubyで書いてみました。

require 'httpclient'
require 'json'
require 'ostruct'

class Dialogue
  def say(msg)
    body = JSON.generate(utt: msg, context: @context.nil? ? "": @context)
    clnt = HTTPClient.new
    uri = 'https://api.apigw.smt.docomo.ne.jp/dialogue/v1/dialogue?APIKEY=(Your API Key)'
    res = clnt.post_content(uri, body, {'Content-Type' => 'application/json'})
    %w(utt yomi mode da context).inject(OpenStruct.new) { |result, key|
      result.send(key + "=", JSON.parse(res)[key])
      @context = JSON.parse(res)[key] if key == "context"
      result
    }
  end
end

感想とかです。
・@context.nil? ? "": @context のところはこれでいいんです。?は多くないです。
 nil?()というメソッドのあとに条件演算子(Rubyではこう呼ぶそうです。C言語だと三項演算子と呼んでいたような?)が続いている感じです。
・HTTPClientだけはgem install httpclientをしたのをおぼえています。その他のものはRubyをインストールしたときに最初から入っていたのだとおもいます(たぶん)。
・OpenStruct(requireのところは、'ostruct')はすごいです。
 カルチャーショックを受けました。
 たとえば
 o = OpenStrcut.new
    o.title = "タイトル"
 puts o.title
 と書くと、titleなんてものは事前に作った覚えも無いのに、自動的に下記のようなメソッドを作ってくれる(※)ようです。
(※)私の理解です。本当はもっと複雑なことをしていただいているのかもしれません。
 def title=(title)
      @title = title
    end
 
 def title
      @title
    end
 
これによりあたかも、titleフィールド(という言い方がよいのかどうかは微妙な気がしますが)に値を書き込んだり、読み込んだりしているようなコードを書けるようです。

0 件のコメント:

コメントを投稿