» カレンダーのブログ記事

継承を使えば既にあるクラスの機能を引き継いで新しいクラスを作る事ができます。
継承の仕方は簡単です。

class クラス名 < 継承したいクラス名

end

「<」を作成するクラス名の後に書き、つづけて継承するクラス名を書くだけです。
今回はHTMLのカレンダーを出力するメソッドを持ったクラスを作ってみます。
まず前回作ったカレンダークラスを「library.rb」という名前で保存します。
2行目の「require “library”」で保存したファイルを読み込みます。

#クラス定義
require "library"

class HtmlCalendar < Calendar

  def disp_html
     calendar = "<table border>\n"
     calendar << "<tr><td>日</td><td>月</td><td>火</td><td>水</td><td>木</td><td>金</td><td>土</td></tr>\n"
     calendar << "<tr>"
     
     #第1週の空白セルを作成
     if @firstday.wday != 0 then
       for x in 1..@firstday.wday do
          calendar << "<td></td>"
       end
     end

     #1日から末日までのセル作成
     for d in 1..@lastday.day do
       if @firstday.wday == 0 then
         calendar << "</tr>\n"
         calendar << "<tr>"       
       end
       calendar << "<td>#{@firstday.day}</td>"
       @firstday = @firstday.next
     end

     #最終週の空白セルを作成
     if @firstday.wday != 0 then
       for x in @firstday.wday..6 do
          calendar << "<td></td>"
       end
     end
     
     calendar << "</tr>\n"
     calendar << "</table>"
     
     puts calendar
  end

end



a = HtmlCalendar.new(2010,9)
a.disp_html
#a.disp

カレンダークラスにあった「initialize(y,m)」や「@firstday、@lastday」が
ありません。これは「Calendar」クラスを継承することにより、記述しなくても
利用可能になります。
45行目でコメントアウトしてある「disp」メソッドも継承しているので利用することができます。

Rubyでプログラムを作る際は「クラス」を定義して、そのオブジェクトを作ってプログラムを組み立てて行きます。
クラスの定義は以下のようにします。

class クラス名

  def initialize()
    処理
  end

  def メソッド

  end

end

ではカレンダープログラムをクラスにしたコードを見て行きます。

#クラス定義

require "date"

class Calendar

  def initialize(y,m)
     @firstday = Date.new(y,m)
     @lastday = Date.new(y,m,-1)
  end
  
  def disp
     calendar = @firstday.strftime("%Y年  %m月")+"\n"
     calendar += "日 月 火 水 木 金 土"+"\n"

     if @firstday.wday != 0 then
       for x in 1..@firstday.wday do
          calendar += "   "
       end
     end

     for d in 1..@lastday.day do
       if @firstday.wday == 6 then
         calendar += sprintf("%2s ",d)+"\n"       
       else
         calendar += sprintf("%2s ",d)
       end
       @firstday = @firstday.next
     end

     puts calendar
   end
end


#クラスの利用
a = Calendar.new(2010,9)
a.disp

5行目でクラス名を決めています。なお最初の文字は大文字で書く必要があります。
7行目の「def initialize(y,m)」はコンストラクタです。これはクラスからオブジェクトを作るとき
最初に実行されるメソッドです。このメソッドはクラスに定義してある変数の初期化をするのに使用します。

def initialize(y,m)
     @firstday = Date.new(y,m)
     @lastday = Date.new(y,m,-1)
end

今回つくるカレンダークラスでは「initialize(y,m)」で引数に年と月を与えて「Date.new(y,m)」に渡し
「@firstday」と「@lastday」をDateクラスのオブジェクトとして利用します。変数名の前に「@」が付いていますが
これはクラス定義の中であればどこでも利用できる変数です。
12行目の「disp」メソッドは前回作成したプログラムの「show_calendar(y,m)」とほぼ同じです。
「disp」メソッドでコンソールにカレンダーを出力します。
36行目の「a = Calendar.new(2010,9)」でカレンダークラスのオブジェクトを作成しています。
「new(2010,9)」でオブジェクトを作成していますがカレンダークラスの内部では
「initialize(y,m)」が呼び出されて引数の値で初期化されています。

メソッドの定義方法は以下の通りです。

def メソッド名(引数1, 引数2,…)
  実行する処理
end

簡単なサンプルを書いてみます。

#メソッド定義
def printRuby
   puts "I Love Ruby"
end

#メソッド呼び出し
printRuby

実行結果は「I Love Ruby」が表示されるだけの簡単なものです。
次に引数と返値のあるメソッドを作ります。

#メソッド定義
def dice(n)
 case n 
   when 1
     a = "サイコロの目は"+(rand(6)+1).to_s+"です。"
      return a
    when 2
      a = "サイコロの目は"+(rand(6)+1).to_s+"と"+(rand(6)+1).to_s+"です。"
      return a
    else
     return "引数には1か2を選んでください。"
 end
end

#メソッド呼び出し
n = dice(2)
puts n

dice(n)でnに入力した「値はcase n」で分岐の条件に使用されます。
「return」の後ろにある値が戻り値としてメソッドを呼び出した元に返されます。
「return a」ではaに入っている値が戻値として返されます。
では前回作ったカレンダープログラムをメソッドにしてみます。

#メソッド定義

require "date"

def show_calendar(y,m)

  firstday = Date.new(y,m,1)
  lastday = Date.new(y,m,-1)

  calendar = firstday.strftime("%Y年  %m月")+"\n"
  calendar += "日 月 火 水 木 金 土"+"\n"

  if firstday.wday != 0 then
      for x in 1..firstday.wday do
          calendar += "   "
      end
  end

  for d in 1..lastday.day do
     if firstday.wday == 6 then
       calendar += sprintf("%2s ",d)+"\n"       
     else
       calendar += sprintf("%2s ",d)
     end
     firstday = firstday.next
  end

  return calendar
end


#メソッド呼び出し
for x in 1..12 do
 puts show_calendar(2010,x)
end

メソッドにすることにより簡単に1年分のカレンダーを表示できるようになりました。

Rubyでカレンダーを作るのに、「Date」クラスを使用します。「Date」クラスには日付を扱うのに便利な機能が備わっています。「クラス」というのはデータとそのデータを使った処理が書かれた設計図みたいなものです。
「Date」クラスには日付データとその処理をする命令が色々と書かれています。

require 'date'

day = Date.today#今日の日付
day1 = Date.new(2010,10,15)#指定した日付
day2 = Date.new(2010,10,-1)#月末

puts "今日の日付"
p day.year #=> 年
p day.month #=> 月
p day.day #=> 日
p day.wday #=> 日曜日が0、土曜日が6
puts "指定した日付"
p day1.year
p day1.month
p day1.day
p day1.wday
puts "月末"
p day2.year
p day2.month
p day2.day
p day2.wday

まず「require ‘date’」で「Date」クラスを利用できるようにします。「day = Date.today」では
「Date」クラスから今日の日付が入った「オブジェクト」を作成しています。オブジェクトとは設計図に基づいて
つくられた実体です。クラスを使用するにはオブジェクトを作成してそのオブジェクトを利用します。
「p day.year」では「day」オブジェクトに対して「year」メソッドを使用して西暦データを取得しています。
「year」メソッドというのは「day」オブジェクトが保持しているデータを処理する命令です。
このメソッドは予め「Date」クラスに備わっています。他にもたくさんのメソッドがあります。
「month、day、wday」も予め用意されたメソッドです。
他のメソッド詳細はリファレンス参照してください。

require 'date'

first = Date.new(2010,10)
last  = Date.new(2010,10,-1)

month = first.strftime("%Y年  %m月")+"\n"
week = "日 月 火 水 木 金 土"

puts month
puts week

if first.wday != 0 then
  for x in 1..first.wday do
     print("   ")
  end
end

for d in first.day..last.day do
   if first.wday == 6 then
     print sprintf("%2s ",d)+"\n"         
   else
     print sprintf("%2s ",d)
   end
   first = first.next
end

4行目で月末の数字が入った「last」オブジェクトを作っています。6行目の「strftime」メソッドでは日付の表示形式を指定しています。
12行目の「if」文では月の第1週目が日曜以外から始まっている場合、空白を出力しています。
18行目からの「for」文では月初から月末までの日付を繰り返し文で出力しています。
「if first.wday == 6 then」では土曜日なら日付の後ろに改行マークを追加しています。
「sprintf(“%2s “,d)」では日付の前後に半角のスペースを入れています。「sprintf」はリファレンス参照。24行目では「Date」クラスの「next」メソッドで日付を1日進めています。これでRDEのコンソールウィンドウに指定した月の
カレンダーを表示できました。しかしこのプログラムでは1年分のカレンダー表示などができません。3行目から25行目までを
12か月分書けば可能ですが非効率です。そこで次回はこのプログラムをメソッドにして繰り返し分の中の処理で呼び出すことにより
12か月分のカレンダーを表示できるようにしてみます。

2024年12月
« 4月    
1234567
891011121314
15161718192021
22232425262728
293031  

カテゴリー

広告

現在の住まい、将来はVPSへ引越します。 ロリポップの上位版です。

広告

広告

最近のコメント

    広告

    Railsを動かす予定のVPS。無料キャンペーン中。

    広告