Ruby 天気予報編 (2) 文字列とシンボル 【計算数学 I】

更新日時:

前半のロードマップ

我々の目標は 2 つに大別されます。 1 つは、天気予報をインターネット上で取得すること、もう 1 つは、それを Twitter に投稿することです。ひとまず前者に向かって進んでいきます。

天気予報を取得するプロセスは

  1. 天気予報 API にアクセスする
  2. その返却値を「 Ruby に都合の良い形」に変換する
  3. それを Ruby で加工する( Twitter に投稿するために)

に分かれます。3. は簡単で、文字列の加工の仕方は前作の教材で学び終えています。 1. は API とは何かという説明をした後に、今回利用する API の仕様を学べば、あとは open-uri モジュールを使用するだけです。問題は 2. の部分です。この部分は、

  • API の代表的な返却値 JSON
  • 変換後の Ruby のクラス Hash

の理解が必要です。前者は量が多くないので、後者から着手します。

つまるところ Hash の説明をしたいところです。しかしその前に 文字列シンボル について説明します。この 2 つはある意味似たようなものでハッシュを使う上ではまずもって不可欠です。文字列の知識はすでに解説済みなので、シンボルについて説明します。今回のプログラムに限って言うと、厳密に言えば、シンボルは不要です。しかし、Ruby のハッシュを学ぶならシンボルは付随すべき知識ですので、ここではしっかり書こうと思います。「当面必要ないことは絶対勉強したくない」という姿勢は数学科では普通しないので、大抵の人は学びたいと思うでしょう。早速説明しようと思います。

シンボルについて

上では仰々しく書きましたが、「シンボル」そのものについては複雑ではありません。文字の並びです。「文字列」も文字の並びですが、Ruby では以下のように記述されます。

  • シンボルは、先頭にコロン : を付けた文字の並びで表す。
  • 文字列は、シングルクォーテーション ‘ or ダブルクオーテーション “ で囲まれた文字の並びで表す。

例えば :sagiri はシンボルで、"sagiri"'sagiri' は文字列です。

これだけわかっておけば、普通の使用については困りません。 シンボルはハッシュとの関連が重要なので、次の記事でまた解説します。

文字列との違い

文字列は String クラスのインスタンスであり、シンボルは Symbol クラスのインスタンスです。両者は to_sym, to_s で互いに変換可能ですが、違うものです。

irb(main):001:0> "sagiri".to_sym
=> :sagiri
irb(main):002:0> :sagiri.to_s
=> "sagiri"
irb(main):003:0> "sagiri" == :sagiri
=> false

どうして似たようなものが2種類実装されているのでしょうか。思想的な表現になりますが、シンボルは、「記号」としての文字列を使用したいときに使用します。否定的には、文字列らしい「加工」をすることが想定されていないときに使用します。文字列は、計算機として「文字列」を取り扱う際に使用します。その「証拠」に次のような違いがあります。

  • シンボルには、文字数をカウントするメソッドや結合用のメソッドがない。文字列には当然ある(String#size, String#+)。
  • シンボルは Ruby 処理系でリストアップすることができる。現在生成されているシンボルは Symbol.all_symbols でリストアップされる。
  • 文字列の場合、同じ文字列であっても、オブジェクトとしては区別される。しかしシンボルの場合は、「同じシンボル」は「 1 つ」しかない。

一番最後のが気になる人は以下のプログラムを理解してみるとよいでしょう。 Ruby では全てのインスタンス(というより全てのオブジェクト)には object_id が振られており、異なるインスタンスたちが同じ object_id をもつことはありません。文字列としては ab は一致していますが、異なるオブジェクトです。

# 文字列
a = "megumi"
b = "megumi"
puts "a.object_id = #{a.object_id}"
puts "b.object_id = #{b.object_id}" # この2つは違う

# シンボル
c = :megumi
d = :megumi
puts "c.object_id = #{c.object_id}"
puts "d.object_id = #{d.object_id}" # この2つは同じ

ナビゲーション

この教材は、東京大学理学部数学科専門科目「計算数学 I」のために執筆されたものです。 このサイトに掲載する際に、記事を分けてあります。 他の回はRuby 天気予報編 一覧 #ks1-ruby-forecastから御覧ください。

Ruby 入門 (計算数学実習資料集)には他の TA が書いた教材があります。

コメントする