• 締切済み

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'などのシンボルは何を表しているのでしょうか。 基本的な質問で恐縮です。色々なサイトを見てもシンボルについての解説が少なく、よく理解ができませんでした。 ご存知の方がいらっしゃいましたらご回答のほどよろしくお願いいたします。

  • Ruby
  • 回答数2
  • ありがとう数15

みんなの回答

  • notnot
  • ベストアンサー率47% (4843/10252)
回答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

  • Calendarクラスの日付更新について

    ある日付を追加した時,うまく正式な日付になりません。 (1) 2002年9月30日にセットする (2) 1日追加する --→この時点で2002年9月31日になっている。 (3) 10月1日に正式な日付に直す という流れなのですが・・・ ソースは以下のとおりです。 public static void main(String[] args) {        Calendar cal = new GregorianCalendar();     /*(1)*/     cal.set(2002,9,30);    /*(2)*/     cal.add(Calendar.DATE,1); /*(3)*/ cal.set(cal.get(Calendar.YEAR),cal.get(Calendar.MONTH),cal.get(Calendar.DATE) ); System.out.println(cal.get(Calendar.YEAR) "年"+ cal.getCalendar.MONTH) +"月"+ cal.get(Calendar.DATE) +"日"); } と、表示させると2002年10月1日になっておらず2002年9月31日になったままです。 これはどこに原因があるのでしょうか?ご指導お願いします。

    • ベストアンサー
    • Java
  • iPhoneアプリプログラミングButton

    現在iPhoneアプリのプログラミングを勉強を兼ねてカレンダーを作っています。 ボタンを押した時、月を移動するプログラムを組むところで処理がうまくいかず困っています。 まず、年月日曜日を取得するとき、int型でyear,monthを宣言し,現在の日付データを入れています。 その値をボタンを押した時に増減させたいのですが、以下の//エラーが出る箇所と記載した場所でviewcontroller not found とエラーが出てしまいます。 ボタンの中のコードから、viewDidLoad内の変数の値を変えるにはどうしたらいいのでしょうか? 「//年・月・日・曜日の取得」と「//月を移動するButton」のコードはviewDidLoad内にコードを書いています。 //年・月・日・曜日の取得 NSDate *now = [NSDate date]; NSCalendar *calendar = [NSCalendar currentCalendar]; NSUInteger flags; NSDateComponents *comps; flags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit; comps = [calendar components:flags fromDate:now]; NSInteger year = comps.year; NSInteger month = comps.month; NSInteger day = comps.day; comps = [calendar components:NSWeekdayCalendarUnit fromDate:now]; NSInteger weekday = comps.weekday;//1日が日曜、7日が土曜 NSInteger firstDayWeek = [self getFirstWeek:year month:month];//月の初日の曜日 //月を移動するButton UIButton *preButton = [UIButton buttonWithType:UIButtonTypeCustom]; [preButton setTitle:@"前月" forState:UIControlStateNormal]; preButton.titleLabel.font = [UIFont boldSystemFontOfSize:10]; preButton.tintColor = [UIColor whiteColor]; preButton.backgroundColor = [UIColor blueColor]; preButton.frame = CGRectMake(10, 30, 30, 20); [preButton addTarget:self action:@selector(preview:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:preButton]; //前月を表示するボタンメソッドの内容 - (void) preview:(id *)sender{ if (_year==1) { //エラーが出る箇所 self.month = 12  //エラーが出る箇所 _month--; //エラーが出る箇所 }else self.month--; //エラーが出る箇所 }

  • Calendarクラスのフィールドは、クラス変数?インスタンス変数?どちらですか?

    宜しくお願いします。 Calendarクラスのフィールドの、Calendar.YEARなどは、 Calendarというクラス名で修飾されているので「クラス変数」ですよね。 クラス変数なので、全てのインスタンスで共有されているはずです。 なので、あるインスタンスから、Calendar.YEARに変更を加えると、全てのインスタンスに 変更が適用されると思うのですが、そうなりません。何故でしょうか。 例えば以下のようなコードを書いた場合、このように出力されます。 2008年10月6日 2009年10月6日 2008年10月6日 YEARはクラス変数なので、3つ目の出力も2009年になると思ったのですが、YEARは 各インスタンスで所有されているようです。 (上手くインデントできないようでして、読みにくいコードで失礼します) import java.util.*; public class DateTest { public static void main(String[]args){ Calendar cal = Calendar.getInstance(); showDate(cal); Calendar cal2 = Calendar.getInstance(); cal2.add(Calendar.YEAR, 1);//ここでCalendarのクラス変数を変更している showDate(cal2);//変更が適用されている showDate(cal);//変更が適用されていない?なぜ? }  //Calendarインスタンスの年・月・日を出力する public static void showDate(Calendar cal){ System.out.println(cal.get(Calendar.YEAR)+"年"              +(cal.get(Calendar.MONTH)+1)+"月" +cal.get(Calendar.DATE)+"日"); } } プログラムは嘘をつかないので、自分の理解が誤っていると思います。 どなたか解決する知識をお持ちの方、どうぞご教示ください。 (初心者ですので、できれば、ほどほどのレベルの説明でお願いします。) 宜しくお願いします。

  • Javascriptで日付毎のチェックボックスを判断する方法

    JAVAで予約できるカレンダーを作成するという課題が学校で出てしまい非常に困っています。 仕様: カレンダー関数により、年・月・日を取得しています。 Calendar cal = Calendar.getInstance(); cal.set(cal.get(Calendar.YEAR),cal.get(Calendar.MONTH),cal.get(Calendar.DATE)); int YEAR = cal.get(Calendar.YEAR); int MONTH = cal.get(Calendar.MONTH)+1; int DATE = cal.get(Calendar.DATE); 下記の機能を”Javascript”で実現したいのですが、力不足でどうすることもできません。 実装したい機能: 予約の日付はカレンダー上にある日付毎に設置されたチェックボックスで判断します。予約できる日付は、選択した日付から前後連続した日付けのみ選択可能で、他の日付をまたいで予約することはできないようにする、というものです。 例をあげてみます。 10月10日のチェックボックスを選択したとします。選択した時点で10月の9、10、11日のみチェックボックスにチェックが可能となり、その他はdisabledにします。 次に10月11日のチェックボックスを選択すると、選択した時点で10月の9、12日が選択できるようになります。予約は連続した日付のみ可能ですので、10、11日とその他はdisabledにしなくてはなりません。 どのようなアドバイスでもかまいません。 回答をお願いします。

  • Java CDLC 1.0 での日付計算

    CLDC(携帯向けJava)での日付計算がうまくいきません。 JavaのSEでは、Calender.addなる日付計算関数があるようですが、 CLDC(携帯向けJava)では使えないみたいなので、以下の実験コードを 書いてみました。しかし、意図する結果が得られませんでした。 このケースでのよい計算方法をご存知でしたらご教授 頂ければうれしく思います。または、 以下のプログラムのバグ、ポカアホミス、作法的要修正点、 日付計算仕様的な可能/不可能等お気づきありましたら、 ご指摘頂ければ嬉しいです。 尚、意図した結果とは、下記の★部分において、 1970年1月1日(?曜日) 0:1:0 です。 グリニッジ標準時 1970 年 1 月 1 日 0:00:00 (エポック) からの 経過時間が、60000ミリ秒(60秒) というのを期待しました。 --以下コード-- void print_cal(Calendar cal){ String WEEK=" 日月火水木金土"; int year =cal.get(Calendar.YEAR); int month =cal.get(Calendar.MONTH)+1; int day_of_month=cal.get(Calendar.DAY_OF_MONTH); int day_of_week =cal.get(Calendar.DAY_OF_WEEK); int hour =cal.get(Calendar.HOUR_OF_DAY); int minute =cal.get(Calendar.MINUTE); int second =cal.get(Calendar.SECOND); System.out.println("" + year + "/" + month + "/" + day_of_month + "(" + WEEK.charAt(day_of_week) + ") " + hour + ":" + minute + ":" + second); } Calendar cal = Calendar.getInstance(); long now = cal.getTime().getTime(); print_cal(cal); cal.set(Calendar.YEAR, 2007); cal.set(Calendar.MONTH, Calendar.MAY); cal.set(Calendar.DAY_OF_MONTH, 31); cal.set(Calendar.HOUR_OF_DAY, 6); cal.set(Calendar.MINUTE, 12); cal.set(Calendar.SECOND, 44); print_cal(cal); //<---- 2007/5/31(木) 6:12:44 long time1 = cal.getTime().getTime(); cal.set(Calendar.YEAR, 2007); cal.set(Calendar.MONTH, Calendar.MAY); cal.set(Calendar.DAY_OF_MONTH, 31); cal.set(Calendar.HOUR_OF_DAY, 6); cal.set(Calendar.MINUTE, 13); cal.set(Calendar.SECOND, 44); long time2 = cal.getTime().getTime(); print_cal(cal); //<------ 2007/5/31(木) 6:13:44 long sabun = time2 - time1; //<---- 60000 Date hoge = new Date(sabun); long hoge_time = hoge.getTime(); System.out.println(hoge_time); <--- 60000 //setTime: Calendar の現在の時刻を、指定された Date に。 cal.setTime(hoge); //★この時点でprint_cal。 print_cal(cal); <---- 1970/1/1(木) 9:1:0 ?9時間も経ってる? long now2 = cal.getTime().getTime(); System.out.println("now2: " + now2); <--- 60000。でも60秒がはいってるぽい --コード以上--

    • ベストアンサー
    • Java
  • 日付と曜日が合わない

    javaのPGを作成しています。 内容的には1週間分のカレンダーを表示しようと思っているのですが・・・・・ Calendarクラスを使用して、対象の日付と曜日を取得しようとしているのですが、 年月日は指定のものが取得できているようなのですが、曜日だけはおそらく来月の曜日を 取ってしまっているようです。 原因がまったく分かりません。 下に、Calendarクラスを使用した部分を抜粋した ソースを記述するので、なにが原因か教えていただけないでしょうか? 【jspファイル内】 <% Calendar cal= Calendar.getInstance(); cal.set( 2010, 11, 25 ); // ※実際は変数だが、正しい値が入っているのは確認済み %>                  ・                  ・                  ・ for ( int loopCnt = 0; loopCnt < 7; loopCnt ++ ){         if ( loopCnt > 0 ){             cal.add(Calendar.DATE,1);         }     // デバッグ用     out.print( cal.get(Calendar.YEAR));     out.print( cal.get(Calendar.MONTH));     out.print( cal.get(Calendar.DATE));     out.print( cal.get(Calendar.DAY_OF_WEEK)); } 【実行結果】 2010 11 25 7 2010 11 26 1 2010 11 27 2 2010 11 28 3 2010 11 29 4 2010 11 30 5 2010 11 31 6

    • ベストアンサー
    • Java
  • java.util.Dateについて

    まずは下記ソースを参照してください。 import java.util.Date; import java.util.GregorianCalendar; import java.util.Calendar; public class Test{     public static void main( String args[] ){         GregorianCalendar cal = new GregorianCalendar(2004, 5, 31);         System.out.println("年:" + cal.get(Calendar.YEAR));         System.out.println("月:" + cal.get(Calendar.MONTH));         System.out.println("日:" + cal.get(Calendar.DAY_OF_MONTH));         System.out.println(); // ただの改行         System.out.println("比較:" + new Date().compareTo(cal.getTime()));     } } 上記ソースについて質問です。 1.「年」「月」「日」を表示しておりますが、本来ならば 「年:2004」 「月:5」 「日:31」 と表示されると思っておりましたが実際は、 「年:2004」 「月:6」 「日:1」 と表示されてしまいます。 なぜでしょうか? 2.12行目にてjava.util.DateクラスのcompareToメソッドを用いて、 現在日付(2004/5/28)と7行目で指定している日付の比較をしていますが、 7行目で設定している日付を現在日付よりも前後に設定して実行させても、 「-1」しか返りません。 なぜでしょうか? 環境は、 J2SDK:1.4.2 OS:Windows XP Pro です。

    • ベストアンサー
    • Java
  • 入力した年月日が過去か現在か未来かを表示するプログラム

    import java.util.*; import java.io.*; import java.text.*; 大事なところだけ抜粋。 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int year = Integer.parseInt(br.readLine()); int month = Integer.parseInt(br.readLine()); int day = Integer.parseInt(br.readLine()); Calendar cal = Calendar.getInstance(); cal.set(year,month-1,day); Calendar today = Calendar.getInstance(); SimpleDateFormat sbf = new SimpleDateFormat("yyMMdd"); Date date1 = cal.getTime(); Date date2 = today.getTime(); String result1 = sbf.format(cal); String result2 = sbf.format(today); 問題はここからです。 入力した年月日が過去か現在か未来か調べるのに<>=は使えないですよね。 どうすればいいのでしょうか。 アドバイス、宜しくお願い致します。

    • ベストアンサー
    • Java
  • java コマンドライン引数を利用したカレンダー

    args[0]に例えば200805と入れたら2008年5月のカレンダーが表示される、そんなプログラムを書きたいと思っています。 理想は↓の形です。(_は空欄の意です;) 2008年5月 日 月 火 水 木 金 土 ___________1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 importは使わないよう指示が出ていますので、フルネームでカレンダークラスを記載しています。 public class CalShow { public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ java.util.Calendar cal = java.util.Calendar.getInstance(); //コマンドライン引数の前4桁をyear、 int year = Integer.parseInt(args[0].substring(0, 4)); //後ろ2桁をmonthとしてそれぞれintで定義 int month = Integer.parseInt(args[0].substring(4)); System.out.println( year + "年" + month + "月"); System.out.println(" 日 月 火 水 木 金 土"); cal.set(year, month - 1, 1); int startDay = cal.get(java.util.Calendar.DAY_OF_WEEK); cal.add(java.util.Calendar.MONTH, 1); cal.add(java.util.Calendar.DATE, -1); int lastDay = cal.get(java.util.Calendar.DATE);      /*なんとなくここまで書けたのですが、ここからどのように木曜日と1日を繋げていけばよいのか分からなくて困っています。 どういったメソッドを使えばいいのかなど、どなたか教えていただけませんでしょうか? よろしくお願いいたします。*/ } }

    • ベストアンサー
    • Java
  • Java 日付の加算がうまくいきません。。どなたか助けてください・・・

    初歩的質問で申し訳ないのですが、ご存知の方ご教授ください。日付の加算についてどうしてもわからない箇所があります。 Calendar cal= Calendar.getInstance((TimeZone.getTimeZone("GMT"))); int year = 2007; int month = 1; int day = 1; cal.set(year,month,day); cal.add(Calendar.DAY_OF_MONTH,100); SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); String tempDate=sdf.format(date); tempDate=2007/05/12 私が求めている結果は tempDate=2007/4/11 なのですが、tempDate=2007/05/12になってしまいます。 お願いします。 環境:WinXp pro Eclipse 3.1 JDK 1.4.2 2007/4/11は Oracle8i の実行結果です。 select to_date('2007-01-01') +100 from dual

    • ベストアンサー
    • Java