• 締切済み

Rubyのシンボルについて教えてください

Rubyのシンボルについて教えてください Rubyのあるライブラリに付随していたサンプルソースを見ており、シンボルが使われているのですがよく理解できません。以下サンプルソースの一部です。 1 def initialize(parent, display_frame, initial_date, calendar_flags) 2 super( parent, 3 :date => initial_date, 4 :style => calendar_flags | RAISED_BORDER) 5 6 @display = display_frame 7 @date = initial_date 8 @weekday_names = %w|Sun Mon Tue Wed Thu Fri Sat| 8 9 evt_calendar self, :on_calendar 10 evt_calendar_month self, :on_cal_month_change 11 evt_calendar_year self, :on_cal_year_change 12 evt_calendar_sel_changed self, :on_calendar_change 13 evt_calendar_weekday_clicked self, :on_calendar_weekday_click 14 end 3,4行目のsuperメソッドの引数に':date => initial_date'とありますが、これは引数initial_dateを変数dateに代入するという意味でよろしいでしょうか。 その場合、7行目の代入式との違いは何なのでしょうか。 また、9行目から13行目にある':on_cal_year_change'などのシンボルは何を表しているのでしょうか。 基本的な質問で恐縮です。色々なサイトを見てもシンボルについての解説が少なく、よく理解ができませんでした。 ご存知の方がいらっしゃいましたらご回答のほどよろしくお願いいたします。

みんなの回答

  • notnot
  • ベストアンサー率47% (4901/10362)
回答No.2

シンボルはあまり他の言語にはないので、理解しにくいかもしれません。Rubyの多くの機能と同じくLisp言語由来の機能です。 意味的には(中身を変更できない)(コンパイルされた)文字列と思えばいいです。 ただ、文字列だと、コピーとか、比較する処理に長さに比例した時間がかかります。 例えば比較で、 a=12345;b=67890のときのa==bと、a="abcde";b="fghij"のときのa==bとで前者の方が速いのはわかりますか? 文字列をコンパイル時に1語に変換しておくとその後の処理が速くなります。 a=:abcde;b=:fghijのときのa==bだと整数同士の比較とと同じ時間で処理できます。 ということで、ハッシュのキーや定数的なものに使われます。 あるいは、その名前固有の値を持つ定数か。 ハッシュのキーなど識別するために使う値に、文字列・定数・シンボルのどれを使うか比べてみましょう。 (1) "date" や "style" を使う方法。 利点: 値を見れば意味がわかる 欠点: 処理が遅い (2) DATE=1;STYLE=2とかしておいて、DATE や STYLE を使う方法 利点: 処理が速い 欠点: デバッグプリントとかで値を見ても元の定数名がわからない。あらかじめ定義が必要 (3) :date や :style を使う方法 利点: 値を見れば意味がわかる。処理が速い 欠点: この使い方の範囲では欠点なし

回答No.1

superの呼び出し部分は、 super(parent, {:date => initial_date, :style => calendar_flags | RAISED_BORDER}) と書かれているのと同じで、superへHashオブジェクトを渡しているのだと思います。 Rubyでは、「メソッドの引数の末尾に要素が1つ以上のハッシュを渡す場合は、{, }を省略することができます。」(http://doc.okkez.net/static/187/doc/spec=2fliteral.html#hash) 9行目から13行目で使われているシンボルの意味は、evt_calendar などの各メソッドの仕様で決まります。メソッドの仕様書があればそこにシンボルの意味が書かれているはずです。 シンボルは、ただの定数だと考えればいいんじゃないかと思います。

関連するQ&A