Hatena::Grouprubyist

Rubyを勉強しようと思ってはじめた日記

2008-01-27はじめてのRuby(8)

配列クラス(2)

| 00:20 |  配列クラス(2) - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク -  配列クラス(2) - Rubyを勉強しようと思ってはじめた日記  配列クラス(2) - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

集合で

  • 共通集合
  • 和集合
  • 集合の差

を取得することが出来る。これ便利!

array1 = [1,3,5,7,9]
array2 = [2,4,5,8,9]

p(array1 | array2)    # [1, 3, 5, 7, 9, 2, 4, 8]
p(array1 + array2)    # [1, 3, 5, 7, 9, 2, 4, 5, 8, 9]
p(array1 - array2)    # [1, 3, 7]

共通集合

array1とarray2どちらともにある要素で出来た配列になっている

配列の和

array1とarray2をあわせた配列になっている

配列の差

array1にしかない要素だけになっている

というわけで、次は配列の各要素に対して何かをする場合について。イテレーターかな。

2008-01-19忙しくてRubyに触ることが出来ない

なかなか

| 14:18 |  なかなか - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク -  なかなか - Rubyを勉強しようと思ってはじめた日記  なかなか - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

忙しくてRubyに触ることが出来ない。

2月ぐらいになったら、ちょっと触りたいなあ。

いろいろと動かしてみて、何回かやってみないといけないんだろうなあ。

2008-01-05はじめてのRuby(7)

配列クラス(1)

| 17:55 |  配列クラス(1) - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク -  配列クラス(1) - Rubyを勉強しようと思ってはじめた日記  配列クラス(1) - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

配列の作り方。色々とあるね。

num = [1,2,3,4,5]
p num   # [1, 2, 3, 4, 5]
a1  = Array.new
p a1    # []
a2  = Array.new(5)
p a2    # [nil, nil, nil, nil, nil]
a3  = Array.new(5,1)
p a3    # [1, 1, 1, 1, 1]

他にも

がある。splitはお馴染みだね。


例外処理(2)例外もオブジェクト

| 17:34 |  例外処理(2)例外もオブジェクト - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク -  例外処理(2)例外もオブジェクト - Rubyを勉強しようと思ってはじめた日記  例外処理(2)例外もオブジェクト - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

  • 例外もオブジェクトになっている
  • エラーの内容で処理を分けることも出来る

こうしたところを使って、Ruby on Railsのエラー画面はでいてるのかな?


例外処理(1)書き方

| 17:23 |  例外処理(1)書き方 - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク -  例外処理(1)書き方 - Rubyを勉強しようと思ってはじめた日記  例外処理(1)書き方 - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

昨日は、なんだかんだと休んでしまった。PHPとか、JavaScriptを触っていました。で、例外処理。元々、Perlを触っていたためか、なれない処理です。でも、便利そうだね。

def foo
    open('./nofile.txt')
end

begin
    foo()
rescue => ex
    print 'ファイル読み込みに失敗しました。', ex.message, "\n"
ensure
    print 'ファイル読み込み', "\n"
end

rescue

  • 例外が発生したときに行う処理
  • messageメソッドでエラー内容が表示できる

ensure

  • 例外が発生しても行う内容

2008-01-03はじめてのRuby(6)

さて、なにを作ろうか

| 23:07 |  さて、なにを作ろうか - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク -  さて、なにを作ろうか - Rubyを勉強しようと思ってはじめた日記  さて、なにを作ろうか - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

Rubyを触るとRuby on Railsを使って...と思ってしまうのだけれど、まずは自分で一つは作ってからの方がいいよねと思ったんです。それは、Ruby on Railsを夏に触ってみて感じたことです。

Ruby on Railsで作ろうと思っていたものは、それはそれでおいて置いて、何を作ってみようかな?

メールフォーム

ウェブサイト制作では必ずといっていいほど話がでるので、これかなあ。

  • 入力
  • 保存
  • メール送信
  • 画面遷移
  • 表示

大体あるしね。DBとかは、また別途で考えよう

Wiki

ああ...mixiのPerlコミュを思い出すなあ...。

日記アプリ

あ、tDiaryのソースを参考に出来るから、いいかも。

画像加工

普段も作ったこと無いのに...でも、オモシロそうだよね


クラス(10)モジュール

| 21:58 |  クラス(10)モジュール - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク -  クラス(10)モジュール - Rubyを勉強しようと思ってはじめた日記  クラス(10)モジュール - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

  • Rubyの特徴の一つ
  • オブジェクトが、データと振る舞いをもった「もの」
  • モジュールは振る舞いだけの「もの」

モジュールの特徴

  • モジュールは、インスタンスを持つことが出来ない
  • モジュールは、継承できない

使い方:名前空間の提供

  • モジュール名::メソッド名で参照できる
p FileTest::size("/usr/local/bin/ruby")
  • Perlのモジュールみたいだ

Mix-in

  • モジュールを混ぜ合わせること
  • クラス定義のなかでincludeを使用する
  • Rubyの継承は多重継承が出来ない(複数のスーパークラスをもてない)が、機能共有をすることが可能に

クラス(9)ポリモルフィズム

| 21:58 |  クラス(9)ポリモルフィズム - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク -  クラス(9)ポリモルフィズム - Rubyを勉強しようと思ってはじめた日記  クラス(9)ポリモルフィズム - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

多相性。オブジェクトが独自のメッセージ解釈を持つこと。

ここは、課題になりそう。

クラス(8)メソッドのアクセス制限

| 21:32 |  クラス(8)メソッドのアクセス制限 - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク -  クラス(8)メソッドのアクセス制限 - Rubyを勉強しようと思ってはじめた日記  クラス(8)メソッドのアクセス制限 - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

PHP5で出来るようになってたね(まあ、あまりPHP5を使う機会が無いのでわかりませんが)。

class AccTest
    public
    def pub
        puts "pub is a public method."
    end 

    private
    def priv
        puts "priv is a private method."
    end 
end

acc = AccTest.new
acc.pub    # pub is a public method.
acc.priv   # AccTest.rb:17: private method `priv' called for #<AccTest:0xb7f638c8> (NoMethodError)
=begin
pub is a public method.
AccTest.rb:17: private method `priv' called for #<AccTest:0xb7f638c8> (NoMethodError)
=end
  • public
    • メソッドをインスタンスメソッドとして使える
    • 何も指定しないとpublicになっている
  • private
    • メソッドをクラスの内部だけで使える
    • initializeは常にprivateになる
  • protected
    • ??

クラス(7)継承

| 21:32 |  クラス(7)継承 - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク -  クラス(7)継承 - Rubyを勉強しようと思ってはじめた日記  クラス(7)継承 - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

クラスの話は盛りだくさん。なかなか終わらない。

継承の形は、

class クラス名 < スーパークラス名
    クラスの定義
end

継承を<で表すのがなんか新鮮

クラス(6)クラス変数

| 20:24 |  クラス(6)クラス変数 - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク -  クラス(6)クラス変数 - Rubyを勉強しようと思ってはじめた日記  クラス(6)クラス変数 - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

  • このクラスすべてのインスタンスで共有できる変数
  • クラス変数を参照するには、アクセスメソッドが必要
class HelloCount
    @@count = 0    #クラス変数
    
    def HelloCount.count    # クラスメソッド
        @@count
    end 

    def initialize( myname="Ruby" )
        @name = myname
    end 

    def hello
        @@count += 1
        print "Hello, World. I am ", @@count, "\n"
    end 
end

#
bob  = HelloCount.new('bob')
jon  = HelloCount.new('jon')
ruby = HelloCount.new


p HelloCount.count
bob.hello
jon.hello
ruby.hello
p HelloCount.count

=begin
0
Hello, World. I am 1
Hello, World. I am 2
Hello, World. I am 3
3
=end
  • クラスメソッドは、クラスに対して操作するためのメソッド。インスタンスで利用するメソッドではない

2008-01-02はじめてのRuby(5)

クラス(5)定数

| 23:10 |  クラス(5)定数 - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク -  クラス(5)定数 - Rubyを勉強しようと思ってはじめた日記  クラス(5)定数 - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

バージョンを設定したりとか...かなあ

class HelloWorld
    Version = "1.0"
end

p HelloWorld::Version    # 1.0
  • 定数も、最初大文字で
  • クラスの外から「::」で参照することが可能

クラス(4)アクセスメソッドを用意する2

| 19:28 |  クラス(4)アクセスメソッドを用意する2 - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク -  クラス(4)アクセスメソッドを用意する2 - Rubyを勉強しようと思ってはじめた日記  クラス(4)アクセスメソッドを用意する2 - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

毎回、アクセスメソッドを用意するのは面倒だし、間違えやすい。そこらへんを補助してくれるのが最初からついてくる(cpanにそんなモジュールあったね、とか思っていた)

class HelloWorld
    def initialize(myname='hatena')
        @name = myname
    end

    def hello
        print "Hello, world. I am ", @name, ".\n"
    end

    attr_accessor:name
end

3種類ある

  • attr_accessor:name → 参照と変更を定義
  • attr_reader:name → 参照を定義
  • attr_writer:name → 変更を定義

クラス(3)アクセスメソッドを用意する

| 19:18 |  クラス(3)アクセスメソッドを用意する - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク -  クラス(3)アクセスメソッドを用意する - Rubyを勉強しようと思ってはじめた日記  クラス(3)アクセスメソッドを用意する - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

  • インスタンス変数は外からはアクセスできない!
    • アクセスメソッドを用意する
class HelloWorld
    def initialize(myname='hatena')
        @name = myname
    end

    def hello
        print "Hello, world. I am ", @name, ".\n"
    end

    def name
        return @name
    end

    def name=(value)
        @name=value
    end

end


matsumoto = HelloWorld.new('matsumoto')
jkondo    = HelloWorld.new

matsumoto.hello    # Hello, world. I am matsumoto.
matsumoto.name
matsumoto.name = 'matsumoto hitoshi'
matsumoto.hello    # Hello, world. I am matsumoto hitoshi.
jkondo.hello
  • name=(value)というメソッドがちょっとびっくり
    • こんな風に書くものなのかなあ?

クラス(2)

| 19:01 |  クラス(2) - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク -  クラス(2) - Rubyを勉強しようと思ってはじめた日記  クラス(2) - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

Rubyで初めてのクラス。

class HelloWorld
    def initialize(myname='hatena')
        @name = myname
    end 

    def hello
        print "Hello, world. I am ", @name, ".\n"
    end 
end

matsumoto = HelloWorld.new('matsumoto')
jkondo    = HelloWorld.new

matsumoto.hello
jkondo.hello
  • クラス名は大文字で始める
  • クラスに定義するメソッドであることを強調するために、クラス名::メソッドという記法もある
  • initializeメソッド
    • 初期化するためのメソッド
    • newメソッドで渡される引数を受け取ることができる
  • @nameは「インスタンス変数」と呼ばれる
    • クラスの中で、他のインスタンスメソッドから参照可能
    • インスタンスごとに別な値を保持することが出来る

クラス(1)

| 18:43 |  クラス(1) - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク -  クラス(1) - Rubyを勉強しようと思ってはじめた日記  クラス(1) - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

いよいよクラス。その前に。

ary1 = []
ary2 = Array.new
str1 = "Hello Ruby"

p ary1    #[]
p ary2    #[]
p ary1.class    #Array
p str1    #"Hello Ruby"
p str1.class    #String

p str1.instance_of?(String)   #true
p ary1.instance_of?(String)   #false

p str1.is_a?(String)  #true
p str1.is_a?(Object)  #true

.class

オブジェクトが何というクラスのオブジェクトなのか知ることが出来る

instance_of?

オブジェクトが何のクラスのインスタンスなのか判断できる

is_a?

継承関係をさかのぼって、クラスに属するか判断できる

メソッド(2)

| 18:30 |  メソッド(2) - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク -  メソッド(2) - Rubyを勉強しようと思ってはじめた日記  メソッド(2) - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

メソッドを定義する

def hello(name = 'somebody')
    print "Hello," + name + "\n"
end

hello()    #Hello,somebody
hello('hatena')    #Hello,hatena
  • ディフォルト値を設定できる
  • 引数名 = 値
  • 返り値を用意するときは、return

メソッド(1)

| 18:21 |  メソッド(1) - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク -  メソッド(1) - Rubyを勉強しようと思ってはじめた日記  メソッド(1) - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

メソッドの形

オブジェクト.メソッド
  • オブジェクトはレシーバーとも呼ばれる
    • メソッドの結果を受け取るため

メソッドの分類

  • インスタンスメソッド
  • クラスメソッド
    • レシーバーがインスタンスではなく、クラスである場合
a = Array.new
t = TIme.now
    • 演算子のように呼び出すことが出来るメソッドもある
  • 関数的メソッド
    • レシーバーが見当たらないメソッド
    • 本当はレシーバーがあるけれど、省略可能
カレンダー
2007 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 09 | 10 | 11 | 12 |
2009 | 06 | 08 |