Hatena::Grouprubyist

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

2008-02-28はじめてのRuby(13)

Mix-in(0)標準モジュール

| 01:56 |  Mix-in(0)標準モジュール - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク -  Mix-in(0)標準モジュール - Rubyを勉強しようと思ってはじめた日記  Mix-in(0)標準モジュール - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

Mix-inといえば、モジュールらしいです。そのモジュールなんですが、何が標準であるんだろう?

調べてみると、色々ありました

これにプラスして「添付ライブラリ」というのがつくと。それ以外はどうしたらいいんだろう?Perlでいうcpanみたいなやつは、RubyGems(るびーじぇむず?)というものらしい。


イテレータをつくる(3)

| 01:25 |  イテレータをつくる(3) - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク -  イテレータをつくる(3) - Rubyを勉強しようと思ってはじめた日記  イテレータをつくる(3) - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

というわけで、本通りではないけれど(本通り書いたら、Ruby 1.8ではエラーに...)作ってみました。

作ってみて思ったこと

  • classを作るのがしやすい
  • イテレータが作れる
    • というかPrototype.jsで作れるんだから当たり前なんだけれど、PHPで作った覚えがないんですね。なんでかな?

で、肝心の「yield」。オブジェクトの参照位置が変わる感じ?わかったような、わからないような。

でも、使いって覚えていこうと思います。

次は、mix-inです。


booklist

require 'book'

class BookList
    def initialize()
        @results  = Array.new
        @booklist = Array.new
    end 


    def add(book)
        @booklist.push(book)
    end 

    def length
        @booklist.length
    end 

    def []=(n,book)
        @booklist[n] = book
    end 

    def [](n)
        @booklist[n]
    end 

    def delite(book)
        @booklist.delete(book)
    end 

    def each
        @booklist.each{|book|
            yield(book)
        }   
    end 

    def each_title
        @booklist.each{|book|
            yield(book.title)
        }   
    end 

    def each_title_author
        @booklist.each{|book|
            yield(book.title, book.author)
        }   
    end 
    def find_by_author(author)
        if block_given?
            @booklist.each{|book|
                if author =~ book.author
                    yield(book)
                end
            }
        else
            @booklist.each{|book|
                if author =~ book.author
                    @results << book
                end
            }
        return @results
        end
    end

end

実行

require 'book'
require 'booklist'

#booklistを作る
booklist = BookList.new

# リストに追加したい本を用意する
book1 = Book.new('たのしいRuby','高橋')
book2 = Book.new('インターネット進化論','梅田')
book3 = Book.new('たのしいRuby 2008','高橋')

# リストに本を追加
booklist.add(book1)
booklist.add(book2)
booklist.add(book3)

# titleを出力
booklist.each_title{|title|
    print title,"\n"
}

#
booklist.each_title_author{|title,author|
    print "[" ,title,"]",author,"\n"
}

#
books1 = Array.new
books1 = booklist.find_by_author(/高橋/)
p books1

#
booklist.find_by_author(/高橋/){|book|
    print book.title,"\n"
}

2008-02-26はじめてのRuby(13)

イテレータをつくる(2)yieldという存在

| 01:14 |  イテレータをつくる(2)yieldという存在 - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク -  イテレータをつくる(2)yieldという存在 - Rubyを勉強しようと思ってはじめた日記  イテレータをつくる(2)yieldという存在 - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

わかったような気がするけれど、ちょっと書きにくい。

たぶん、わかっていない。

書きながらじゃなくて、何度か使ってみないとわからない感じがする。

2008-02-25はじめてのRuby(12)

イテレータをつくる(1)

| 01:16 |  イテレータをつくる(1) - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク -  イテレータをつくる(1) - Rubyを勉強しようと思ってはじめた日記  イテレータをつくる(1) - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

まずはクラスを作ってみました。クラスだけじゃ話は進まないです。

BookListにあるBookを一気にタイトル一覧を得るメソッドを作ってみるというのが、イテレータの話になります。というわけで、準備が整った状態です。

クラスを作ってみて思いましたが、クラスが作りやすいですね。見通しがいいというか。あと、クラスごとでファイルを分けてますね。これも、そいうものだ、と思っていたので良い感じです。


Bookクラス

class Book
    attr_accessor :title, :author, :genre

    def initialize(title, author, genre=nil)
        @title  = title
        @author = author
        @genre  = genre
    end 
end

BookListクラス

require 'book'

class BookList
    def initialize()
        @booklist = Array.new
    end 


    def add(book)
        @booklist.push(book)
    end 

    def length
        @booklist.length
    end 

    def []=(n,book)
        @booklist[n] = book
    end 

    def [](n)
        @booklist[n]
    end 

    def delite(book)
        @booklist.delete(book)
    end 

end

実行

require 'book'
require 'booklist'

#booklistを作る
booklist = BookList.new

# リストに追加したい本を用意する
book1 = Book.new('たのしいRuby','高橋')
book2 = Book.new('インターネット進化論','梅田')

# リストに本を追加
booklist.add(book1)
booklist.add(book2)

print booklist[1].title

2008-02-18

目標

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

  • たのしいRubyを3月末までに終了させよう!

2008-02-17はじめてのRuby(11)

Enumerable

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

Enumerableモジュールをインクルードしている場合、下記のようなメソッドなどが使える

イテレータとは?

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

  • 繰り返しを司るモノ
  • 繰り返しを実現するための構文も「イテレータ」

繰り返しの構文の特徴

  • 繰り返したい処理を表す部分がある
  • 繰り返しごとに異なる値を持つ部分がある

Timeオブジェクト

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

Timeオブジェクトから時刻を取得することができる

t = Time.new
p t
p t.strftime("%Y年%m月$d日")

出力を変更することもできる。

パースもできる。

require "parsedate"
include ParseDate
t = Time.new
p t    # Sun Feb 17 18:30:37 +0900 2008
p t.strftime("%Y年%m月$d日")
p parsedate("2008/02/17/")    # [2008, 2, 17, nil, nil, nil, nil, nil]

こんなことも可能

t2=parsedate("2008/02/17/")
p t2    # [2008, 2, 17, nil, nil, nil, nil, nil]

2008-02-12はじめてのRuby(10)

ちょっと飛ばそうかな?と思った理由のメモ

| 01:37 |  ちょっと飛ばそうかな?と思った理由のメモ - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク -  ちょっと飛ばそうかな?と思った理由のメモ - Rubyを勉強しようと思ってはじめた日記  ちょっと飛ばそうかな?と思った理由のメモ - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

Rubyを触ってみて、とっつきやすいというか、スムーズに流れてくる感じがします。そうなってくると、やっぱり何か作りたくなるんですよね。でもちょっと我慢しつつ、ある程度飛ばして、timeオブジェクトを触ってみようと思います。

あと、ついでにデザインを標準的なやつにしました。はてなグループと、はてなダイアリーでデザインテンプレートの共有って出来ないような、出来ているような感じなんですね。

ハッシュ(1)値・キーを取り出す

| 01:25 |  ハッシュ(1)値・キーを取り出す - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク -  ハッシュ(1)値・キーを取り出す - Rubyを勉強しようと思ってはじめた日記  ハッシュ(1)値・キーを取り出す - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

配列として全部の値を取り出す

h = { "cat" => "たま", "dog" => "ぽち"}
p h.keys    # ["cat","dog"]
p h.values  # ["たま","ぽち"]
p h.to_a    # [ ["cat","たま"],["dog","ぽち"] ]

これ以外に、イテレーターを利用して値を取り出す方法がある

文字列(3)

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

  • 文字列は配列のメソッドがいくつか使える
    • 文字列は「バイトごとの文字コードによる配列」とみなして考える
  • Enumerableモジュールが組み込まれている
    • Enumerableモジュール?
    • この後出てくるらしい

文字列(2) 文字列の検索と置換

| 00:42 | 文字列(2) 文字列の検索と置換 - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク - 文字列(2) 文字列の検索と置換 - Rubyを勉強しようと思ってはじめた日記 文字列(2) 文字列の検索と置換 - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

文字列に該当するのがあるかどうか調べるだけなら、include?メソッドで探せる

string = "sumomomomomomomomonouchi"

p string.index("momo")    # 2
p string.include?("momo") # true

2008-02-10はじめてのRuby(9)

文字列(1)文字列の長さを知る

| 18:38 | 文字列(1)文字列の長さを知る - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク - 文字列(1)文字列の長さを知る - Rubyを勉強しようと思ってはじめた日記 文字列(1)文字列の長さを知る - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

文字列を扱う方法は大切。

大切に扱いたいですね。

string =  "オブジェクト指向言語Ruby"
p string,"\n"
p string.length
p string.split(//u).length

lengthや、sizeで知ることができるのはバイト数。

そこで、正規表現を利用して文字数をカウントする。今回はUTF-8

例として、EUCや、Shift-jisが出ています。

p string.split(//e).length    # EUC
p string.split(//s).length    # Shift-jis

でも、これは試していない。

配列クラス(5)

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

多重配列というか、配列の中に配列を入れる場合について。

本を読んでいたら、1.6と1.8では違うよ!という記述が見つかりました。ここは注意!

{Ruby] 配列クラス(4)eachとeach_with_index

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

each

eachを使うと要素のインデックスはわからないけれど、配列の要素すべてにアクセスができる

list = [1,12,34,14,5,6]
subm = 0;
list.each{|elem|
    sum += elem
}
print "合計値は", sum, "です\n"

結果

合計値は72です

each_with_index

each_with_indexを使うと、インデックスもわかりつつ、配列の要素すべてにアクセスができる

list = [1,12,34,14,5,6]
list.each_with_index{|elem, i|
    print i+1, "番目の要素は", elem, "です\n"
}

結果

1番目の要素は1です
2番目の要素は12です
3番目の要素は34です
4番目の要素は14です
5番目の要素は5です
6番目の要素は6です

2つのメソッドがあるんだねぇ...

配列クラス(3)

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

配列内の各要素を処理する

list = [1,12,34,14,5,6]
for i in 0..3
    print i+1, "番目の要素は", list[i], "です\n" 
end

1番目の要素は1です
2番目の要素は12です
3番目の要素は34です
4番目の要素は14です

for文で要素を1つずつ処理していくパターン。

ありがちだけれど、慣れ親しんでいますね。

試した男試した男2009/07/09 11:56日本語の処理を伴うスクリプトは、 ruby -Ks <ファイル名> のように、 -Ks オプションをつけないとエラーが出ますね。

試してない男試してない男2010/02/13 17:40日本語ふつーに使えちゃってますよ!環境によってはオプションつけなくても平気ですよ!

カレンダー
2007 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 09 | 10 | 11 | 12 |
2009 | 06 | 08 |