クラスメソッドとself

クラスメソッドの定義ではselfが使えます。そのほうがクラス名を明記するよりもよいスタイルのようです。想像するに、クラス名をリファクタリングしたときの修正箇所が減るからではないでしょうか。

class Rubyco
    def self.hello
        print "Hello, Rubyco!\n"
    end
end

Rubyco.hello

Thread#joinでスレッド終了を待つ

1000回ずつ表示して終了します。メインスレッドが終わるとプログラムが終了してしまうので、Thread#joinで待つことにします。

t1 = Thread.start {
    1000.times {
        print "1"
    }
    print Thread.current
}

t2 = Thread.start {
    1000.times {
        print "2"
    }
    print Thread.current
}
t1.join
t2.join

実行結果。

11111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111
11111122222222222222222222222222222222222222222222222222222222222222222222222222
22222222222222222222222222222222222222222222222222222222222222222222222222222222
22222222222222222222222222222222222222222222222222222222222222222222222222222222
22222222222221111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111112222222222222222222222222222222222222222222222222222222222
22222222222222222222222222222222222222222222222222222222222222222222222222222222
22222222222222222222222222222222222222222222222222222222222222222222222222222222
22222222222222222222222222222111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111122222222222222222222222222222222222222222
22222222222222222222222222222222222222222222222222222222222222222222222222222222
22222222222222222222222222222222222222222222222222222222222222222222222222222222
22222222222222222222222222222222222222222222222221111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111112222222222222222222222
22222222222222222222222222222222222222222222222222222222222222222222222222222222
22222222222222222222222222222222222222222222222222222222222222222222222222222222
2222222222222222222222222222222222222222222222222222222222222222222111111#<Threa
d:0x2946e68>2222222#<Thread:0x29456c8>

Thread.startでスレッド起動

Thread.startで新しいスレッドを起動します。

Thread.start {
    while true
        print "1"
    end
}

while true
    print "2"
end

実行結果は次のようになります。

1111111111111111111111111111111111111222222222
2222222222222222222222222222222222222222222222
2222222222222222222222222222222222222222222211
1111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111
2222222222222222222222222222222222222222222222
2222222222222222222222222222222222222222222222
1111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111
2222222222222222222222222222222222222222222222
2222222222222222222222222222222222222222222222
1111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111
2222222222222222222222222222222222222222222222
2222222222222222222222222222222222222222222222
2222111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111
1111111111122222222222222222222222222222222222
2222222222222222222222222222222222222222222222
2222222222222222211111111111111111111111111111

::で定数のスコープ

で定数のスコープを明示的に表すサンプルです。
# スコープ
Value = 1
class MyClass
    Value = 2
    def method
        print ::Value, "\n"         # => 1
        print MyClass::Value, "\n"  # => 2
        print Value, "\n"           # => 2
        for x in 1..1
            print Value, "\n"       # => 2
        end
    end
end

print "** out **\n";
print Value, "\n";              # => 1
print ::Value, "\n";            # => 1
print MyClass::Value, "\n";     # => 2
print "** in **\n";
a = MyClass.new;
a.method

実行結果

** out **
1
1
2
** in **
1
2
2
2

定数は大文字で

大文字で始まる識別子は定数になり、2回代入しようとすると警告が出ます。警告は出ますが、代入はできるようです。

MESSAGE = "Hello Ruby!\n"
print MESSAGE
MESSAGE = "Hello, again!\n"
print MESSAGE

実行結果の抜粋。

Hello Ruby!
warning: already initialized constant MESSAGE
Hello, again!

足し算表

1+1から9+9までの足し算表をCSV形式で出力します。

for x in 1..9
    for y in 1..9
        print "\"#{x}+#{y}=#{x+y}\","
    end
    print "\n"
end

結果

"1+1=2","1+2=3","1+3=4","1+4=5","1+5=6","1+6=7","1+7=8","1+8=9","1+9=10",
"2+1=3","2+2=4","2+3=5","2+4=6","2+5=7","2+6=8","2+7=9","2+8=10","2+9=11",
"3+1=4","3+2=5","3+3=6","3+4=7","3+5=8","3+6=9","3+7=10","3+8=11","3+9=12",
"4+1=5","4+2=6","4+3=7","4+4=8","4+5=9","4+6=10","4+7=11","4+8=12","4+9=13",
"5+1=6","5+2=7","5+3=8","5+4=9","5+5=10","5+6=11","5+7=12","5+8=13","5+9=14",
"6+1=7","6+2=8","6+3=9","6+4=10","6+5=11","6+6=12","6+7=13","6+8=14","6+9=15",
"7+1=8","7+2=9","7+3=10","7+4=11","7+5=12","7+6=13","7+7=14","7+8=15","7+9=16",
"8+1=9","8+2=10","8+3=11","8+4=12","8+5=13","8+6=14","8+7=15","8+8=16","8+9=17",
"9+1=10","9+2=11","9+3=12","9+4=13","9+5=14","9+6=15","9+7=16","9+8=17","9+9=18",