Ruby">
]>
ためになる話 / &Ruby;
&Ruby; の特徴的で便利そうな機能を簡単に紹介
他のプログラミング言語をある程度使える人が &Ruby;
を習得するのにちょうどいい一冊。
日常的な作業を自動化する
シミュレーション結果を処理する
頭の体操
Lightweight language
オブジェクト指向言語
日本でわりと人気
最近は欧米でも人気
日本における Lightweight Language の注目度
● Ruby
● Perl
● PHP
● Python
● Tcl
irb
: 対話型 ruby
Debian
なら apt-get install irb で
$ irb
irb(main):001:0> puts "Hello, world!"
Hello, world!
nil
irb(main):002:0>
a, b, c = 1, 2, 3
b, c = c, b
puts "a=#{a}, b=#{b}, c=#{c}"
a=1, b=3, c=2
irb(main):002:0> -1942.abs
1942
irb(main):003:0> a = [] 変数宣言不要
[]
irb(main):004:0> a.push (32)
[32]
irb(main):005:0> a.push 45 括弧は省略可能
[32, 45]
irb(main):006:0>
ちなみに Perl では...
push @a, 32;いけてない
push @a, 45;
irb(main):098:0> [3, 1, 7, 0].sort.reverse
[7, 3, 1, 0]
ちなみに Perl では...
reverse sort 3, 1, 7, 0
繰り返し処理を華麗に記述
繰り返しは使用頻度が高いので、
うまく書けると気持ちがいい
他の言語と同じ構文もあるが...
for i in ['fee', 'fi', 'fo', 'fum']
puts i
end
fee
fi
fo
fum
もっと直感的に...
3.times do
print 'Ho! '
end
Ho! Ho! Ho!
0.upto 9 do |x|
print x, ' '
end
0 1 2 3 4 5 6 7 8 9
(0..10).each { |i| print i ** 2, ' ' }
0 1 4 9 16 25 36 49 64 81 100
Perl で同じことをするには?
puts ((1..10).collect { |n| n * 5 }.join ', ')
5, 10, 15, 20, 25, 30, 35, 40, 45, 50
Perl で同じことをするには?
File.open ('data').grep /d$/ do |line|
print line
end
行の順番を入れ替えて出力する (最後の行が最初に来るようにする) には?
ちなみに Perl では...
open my $file, '<', 'data';
print for grep /d$/, <$file>;
close $file;
行の順番を入れ替えて出力する (最後の行が最初に来るようにする) には?
メソッドは、引数の他にブロックを指定できる
イテレータは、ブロックを呼び出す単なるメソッド
def fib_up_to (max)
i1, i2 = 1, 1
while i1 <= max
yield i1
i1, i2 = i2, i1 + i2
end
end
fib_up_to (1000) do |f|
print f, ' '
end
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
これで何が嬉しい?
Perl で同じことをするには?
ちなみに JavaScript 1.7 では...
function fib () {
var i1 = 1, i2 = 1;
while (true) {
yield i1;
var t = i1;
i1 = i2;
i2 += t;
}
}
var g = fib ();
while (true) {
var v = g.next ();
if (v > 1000) break;
print (v);
}
&Ruby; のイテレータは、 Python
や JavaScript のジェネレータ / イテレータとは異なり、
コールバック関数に近い。
class Array
def inject (n) Ruby 1.7 以降は標準の機能
each { |value| n = yield (n, value) }
n
end
def sum
self.inject (0) do |n, value|
n = n + value
end
end
def product
self.inject (1) do |n, value|
n = n * value
end
end
end
puts [1, 2, 3, 4, 5].sum
puts [1, 2, 3, 4, 5].product
15
120
どうしてこうなる?
開始点と終了点により定義されるオブジェクト
数値に限らず、どんなオブジェクトでも (特定のメソッドを定義すれば) 使える
irb(main):090:0> digits = 0..9
0..9
irb(main):091:0> digits.include? 5
true
irb(main):092:0> digits.min
0
irb(main):093:0> digits.max
9
irb(main):094:0> digits.reject { |i| i < 5 }
[5, 6, 7, 8, 9]
irb(main):095:0> digits === 7
true
Perl の ..
との違いは?
ソースコード内にドキュメントを書く
rdtools を使って
HTML 等に変換できる
ちなみに他の言語では...
)) for details.
...
== Instance Methods
--- Tempfile.open ( filename )
Opens the file...
== Return Codes
..
The method (()) raises an (({IOException}))...
=end]]>
正規表現
例外
Mixin
変異メソッド
C 言語用 API