実際二日目じゃないけど、ここに記述するのは二日目ってことで!!!
クラスの定義
オブジェクト指向言語といえばクラスでしょう。
これが無きゃはじまらない!!!
定義は
class 名前 ここに色々 end
でいける!
早速!!!
サンプル クラスの定義
# クラス作るぜ class Hoge def foo puts "Hoge#foo" end end # クラス使うぜ hoge = Hoge.new # インスタンス化 hoge.foo # 定義したメソッド呼び出し
実行結果
Hoge#foo
予想通り。
インスタンス変数は、どうなってるんだろう?と思ったら@をつけたらいいらしい。
早速!!!
ついでだしコンストラクタも使うサンプルにしてしまおう。
initializeっていう名前のメソッドがコンストラクタのようだ。
引数も指定し放題?
デフォルトの値も設定できるようだ。C++みたい。
サンプル (コンストラクタ、フィールド)
# 人! class Person # コンストラクタ! 引数に名前を受け取る!デフォはTarouさん def initialize name = "Tarou" @name = name # @つきがフィールド end # 挨拶くらいしなさいということで def greet puts "Hello!! My name is #{@name}." end end # デフォの名前 tarou = Person.new # 明示的に名前を指定する jirou = Person.new "Jirou" # 後は太郎と二郎に挨拶させる tarou.greet jirou.greet
実行結果
Hello!! My name is Tarou. Hello!! My name is Jirou.
無問題。
こうやって作ったフィールドって外からアクセスできるのかな?
やってみよう。
さっきのコードの後に次の文を加えて実行をしてみた。
tarou.name = "Saburou" tarou.greet
結果は、エラー。
D:/iyan/rb140.tmp:35: undefined method `name=' for #<Person:0x2940000 @name="Tarou"> (NoMethodError)
そんなメソッドは無いか…。
じゃぁ@つければいいのか?ということでこうしてみた。
tarou.@name = "Saburou" tarou.greet
結果は、エラー。
D:/iyan/rb140.tmp:35: parse error, unexpected tIVAR tarou.@name = "Saburou"
文法すらあってないようだ。普通の状態じゃアクセスできないのね。
カプセル化ってやつか!!!
次。
こういうときに、外からアクセスしたいフィールドもあるよね。
そんな時の書き方が載ってた。
def なんとか=(arg) @なんとか = arg end
みたいにすれば、外から代入できるみたい
def なんとか() return @なんとか end
これで外から取得できるらしい。
Javaでいうところのgetter/setterってところですな。
早速!!
サンプル(getter/setter)
# 人! class Person # コンストラクタ! 引数に名前を受け取る!デフォはTarouさん def initialize name = "Tarou" @name = name # @つきがフィールド end # 挨拶くらいしなさいということで def greet puts "Hello!! My name is #{@name}." end # 名前は自由にお使いください # getter def name=(name) @name = name end # setter def name() return @name end end # デフォの名前 tarou = Person.new # 明示的に名前を指定する jirou = Person.new "Jirou" # 後は太郎と二郎に挨拶させる tarou.greet jirou.greet # name=メソッドで名前書き換え tarou.name = "Saburou" tarou.greet # nameメソッドで名前取得 puts tarou.name
実行結果
Hello!! My name is Tarou. Hello!! My name is Jirou. Hello!! My name is Saburou. Saburou
名前がちゃんと書き換わってる。やりたいことが出来た。
でも、いちいち書くのめんどくさいだろ?っていうことで略記法が用意されてるらしい。
attr_accessor :名前
これでOKだとか。ラクチン。
さっきのPersonクラスをこれを使って書き換えると
# 人! class Person # コンストラクタ! 引数に名前を受け取る!デフォはTarouさん def initialize name = "Tarou" @name = name # @つきがフィールド end # 挨拶くらいしなさいということで def greet puts "Hello!! My name is #{@name}." end # 名前は自由にお使いください # getter # def name=(name) # @name = name # end # setter #def name() # return @name #end attr_accessor :name end
スッキリ。
読み取り専用、書き込み専用の略記法もある。
読み取り専用 | attr_reader :hoge |
書き込み専用 | attr_writer :hoge |
両方 | attr_accessor :hoge |
用途に応じて使い分けてください。
継承
ついに継承。
といってもそんなに書くことは無い。
継承の仕方は
class クラス名 < 親クラス名 end
以上!!
簡単なサンプルだけでお茶をにごす。
サンプル(継承)
# 本当に普通の人なんです。 class Man attr_accessor :name def initialize name = "Tarou" @name = name end # 挨拶は大事 def greet puts "こんにちは。私の名前は#{@name}です。" end # 謙虚さも大事 def talk puts "私は普通の人ですよ." end end # あの人なんです。でも所詮普通の人が元なんです。 class SuperMan < Man # でも、しゃべることは凄いんです。 def talk puts "私は凄い人ですよ." end end # 普通の人お願い! man = Man.new man.greet man.talk # スーパーマンお願い! super_man = SuperMan.new super_man.greet super_man.talk
実行結果
こんにちは。私の名前はTarouです。 私は普通の人ですよ. こんにちは。私の名前はTarouです。 私は凄い人ですよ.
同じTarouさんとは思えないくらい自信満々になっちゃいました。
継承することで、自信の無い部分を自信満々に置き換えちゃったんですね。
今日はここまで!!
次は正規表現かな〜?