Lambdaカクテル

京都在住Webエンジニアの日記です

Invite link for Scalaわいわいランド

Ruby日記(hashとjson)

JSONを使うときちょっと疑問が出たので調べたメモ.

JSON

おなじみのやつ.

# ライブラリをimportしてくるときはrequireって書けばいいようだ
require "json"

s = '{"foo":"bar"}'
j = JSON.parse(s)

# j.foo
# 残念!こうは書けないのだ

j['foo'] # こっちは動く

# ネストしてるときは
# j['foo']['bar'] って書けばよい

parse はハッシュを返すので,オブジェクトと同じような記法は使えない.ハッシュに対してはhash[key]という記法を使うことになる. 油断するとhash.keyって書きそうになってしまうけど,Perlでも同じように分けて書くのでまあそんなもんだと思っておく.

rubydoc? 便利

rubyで困ったときはruby jsonみたいにググると十中八九公式のマニュアルが出てくるのでありがたい. rubyなので日本語ネイティブのマニュアルが出てきて,謎機械翻訳を見て苦しむということもない.

特異メソッド 何

そういえばrubydoc(っていう呼び方でいいの?)見てたら特異メソッドという聞き慣れない単語が登場した.

特異メソッドとはクラスではなくある特定のオブジェクトに固有のメソッドです。特異メソッドの定義はネストできます。 クラスの特異メソッドはそのサブクラスにも継承されます。言い替えればクラスの特異メソッドは他のオブジェクト指向システムにおけるクラスメソッドの働きをすることになります。 特異メソッド定義式は、メソッド名を Symbol にしたオブジェクトを返します。

なるほど?

Ruby では、クラスもオブジェクトなので

あー,なるほど.

  • オブジェクトには特異メソッドを生やすことができる
  • 特異メソッドは他のオブジェクトには影響しない,そのオブジェクトだけのメソッドである
  • ところでRubyにおいてクラス自体も一種のオブジェクトである(Common Lispやってると,あーメタクラスですな?となる)
  • したがって,クラスに特異メソッドを生やすと,他の言語で言うところのクラスメソッドとしてふるまう
    1. クラスにメソッド実装するだけじゃいかんのか?
    2. それだといわゆるインスタンスメソッドになっちゃう
オブジェクト クラス
メソッド 不可能 いわゆるインスタンスメソッド
特異メソッド そのオブジェクトに固有のメソッドが生える いわゆるクラスメソッド

オブジェクトにメソッド生やすのはまぁ不可能ですよね.そのために特異メソッドがある.クラスありきで考えるのではなくて,元々世界にはオブジェクトしかなくて,でもクラスってやつがあったら便利じゃん,というふうに世界を進展させていくと考えると,まず特異メソッドが出現して,次にメソッドが出現するような感じもする.どちらかといえばメソッドのふるまい(そのクラスをインスタンスにしたとき,そのインスタンス固有の操作ができるようにする)のほうが特殊な感じがする.

よかったですね.

★記事をRTしてもらえると喜びます
Webアプリケーション開発関連の記事を投稿しています.読者になってみませんか?