RubyとC言語における文字列リテラルの違い

こちらのブログ(TECS 開発ブログ ruby のシンボルと文字列)で触れられているrubyのシンボルと文字列の違いについでですが、私はRubyとC言語における文字列リテラルの扱いの違いの影響の方が大きいのではないかと思います。

C言語で

char *a = “ABCEDFG”;

char *b= “ABCEDFG”;

とかくと、「AGCDEFG」がstaticな領域に取られて、aとbが同じアドレスを指すようになります。

#C言語の規格を見ていないので、正確ではないかもしれません。同じなドレスをさすことが多いとしておきます。

しかし、Rubyの場合、単に”ABCDEFG”とすると、これはString.new(“ABCDEFG”)と同じことであり、”ABCDEFG”という文字列を持つStringクラスのインスタンスを生成することになります。

p “ABCDEFG”.object_id

p “ABCDEFG”.object_id

と2回書くと、それぞれ異なる値のオブジェクトIDを返します。

最初に書いたC言語の書き方に近いことをRubyで実現するには、シンボルリテラルを使います。

p :ABCEDFG.to_sym

p :ABCEDFG.to_sym

こちらは、同じシンボルリテラルならば常に同じSymbolオブジェクトを指します。

ただし、Symbolオブジェクトは一致するかしないかぐらいしか比較する手段がありません。

#Ruby 1.9ではメソッドが増えているので事情は違っていますが。

Symbolオブジェクトに対して文字列長の大小の比較とか、アルファベット順のソートなどは出来ません

その点から言うと、文字列というよりはC言語でいうポインタとか配列の添え字を用いた比較に近いです。

C言語でもポインタの値自体の大小比較とか、ソートなどは極めて限定された状況でないと意味のある結果は得られません。

Rubyの中でもSymbolクラスは特殊です。

特筆すべきは、Symbol.newはNoMethodErrorになることです。

Symbolオブジェクトを作るには、シンボルリテラルを記述するかStringクラスのto_symメソッド、internメソッドを用います。

SymbolオブジェクトとStringオブジェクトは1対1対応しています。

またそれぞれのクラスにto_str, to_symが定義されています。

したがって、SymbolオブジェクトとStringオブジェクトの間で同値姓をチェックしたいならば、いったんどちらかに変換してから==で比較するという方法を取ることはできます。

# 本来は、比較する対象があいまいにならないようにするべきでしょうが。

これは私見ですが、Rubyで文字列リテラルが毎回異なるStringオブジェクトを生成すること自体を知らない人の方が多いのではないでしょうか。

もっというと、Stringクラスの非破壊的メソッドを使っているのに、「文字列が変更されていない。おかしい!」という質問がくることの方が多いです。

メソッドの返値が新たに生成されたオブジェクトであることを気にしなくても、Rubyプログラミングは出来てしまう、というか、トレードオフとして「安全である」と強調されます。

多分、Symbolがあることを知らない人の方が多いのでは。

また、初級者のレベルでは、「何故Symbolを使う必要があるか分からない」はずです。

結局、Symbolを使おうという人は、Ruby使いの中では明らかに初心者ではないです。

(上級者でない)多くの人にとって、Symbolは知らないし、知っても、使い道が分からない、有難味が分からないがため、使わないのが現状ではないでしょうか。

#ライブラリとか、フレームワークをつくる側になると、無視できない無駄に感じるようになると思います。

ETロボコンフォーラム-東海・関西参加者の集い-

SWESTのメーリングリストにて、「ETロロボコンフォーラム-東海・関西参加者の集い-」の開催を知りました。
このイベントの目的は、
「ETロボコン2009の参加チーム有志が東海、関西の地域を超えてETロボコンで自分たちのチームで取り組んだこと、参加の目的と効果などを発表」
ということで、
「ETロボコンの参加を検討されている方や、他チームがETロボコンをどのように活用しているか興味をお持ちの方はもちろん、ETロボコンをご存じでない方も是非、参加してください。」
とのことでしたので、(ETロボコンにはもちろん興味がありますが、それ以上にETロボコンに興味を持つ人に興味があるので)早速参加申し込みしました。

  • 日時 2010年03月27日(受付13:15 開始13:30 終了 16:00)
  • 場所 名古屋市西生涯学習センター
    (愛知県名古屋市西区浄心一丁目1-45)

http://kokucheese.com/event/index/1714/

ちなみに、タイトルに「東海・関西参加者の集い」とありますが、参加はどの地域の方でも可能とのことです。

# ETロボコンに興味を持つ人に興味がある->
以下のURLで公開しているTOPPERS/JSP 1.4.3へのパッチ(Linuxの特定のバージョンに依存しないようにしたLinux上のTOPPERS/JSPシミュレータ)が、ETロボコン参加者の方にダウンロードされているようです。

http://northern-cross.info/download.html

TOPPERSプロジェクトは、ETロボコンにてTOPPERS賞を設けています。
(ETロボコン2009における受賞者は チーム「KTEC」)

オントロジー工学による機能モデリングツール「OntoGear」

MetaMoji、オントロジー工学による機能モデリングツール「OntoGear」を提供へ – Enterprise Watch

私が今かかわっているTECSは、ソフトウェア開発における設計の観点からみると、抽象度のレベルは、ソースコードに落とし込む直前ぐらいに当たります。

つまり、TECSで表現されるものは、かなり(ソースコードによる)実装に近いものになるということです。
TECSのレベルでの設計の良し悪しは、さらにその上流に当たる部分の良し悪しや、上流での意図や決定をどれだけ反映しているかが大きく影響してきます。

TECSによる開発も、TECSとして提供される技術だけで完結するものではなく、より良い結果を得るためにはやはり上流でのより良い設計が必要です。

その意味で、今回のモデリングツールといのは興味深いです。
無償提供ということですので、早速入手して試してみようと思います。

追記:提供は5月10日からの予定でした。それまで待つことにします。