tsucchi’s diary(元はてなダイアリー)

はてなダイアリー(d.hatena.ne.jp/tsucchi1022)から移行したものです

「初めての Ruby」一人勉強会 7日目

ずいぶん期間が開いてしまったなぁ。Ruby をぼちぼち勉強しています。


教材はコレ↓
初めてのRuby


今日は第6章。変数

これを読みつつ、つぶやいてみます。

以下、つぶやきメモ。

※1 今のところ、正直あまり Ruby は好きではありません。
※2 オイラがまともにそこそこ書ける言語は C#, Java(5.0より前), Perl です。言語の機能を語っているときはその辺との比較になっているはず
※3 Ruby はまだほとんど理解していないので、的外れでトンチンカンな批判してるかも
※4 コードはサンプルそのままのときと、オイラが勝手に変えてるときがあります

引数はすべて参照渡し(p.98-99 例6-2)
def describe(name)
  name = name.dup
  puts "This is a #{name}."
  name[2] = ?p
  puts "This is a #{name}."
end

パラメータを変更したくない時は dup で複製するらしい。String に関しては、Java とか C# に慣れている身としてはちょっと気持ち悪いというか、エンバグしそうだなぁ。

インクリメント/デクリメント(p.107 コラム)

単項のインクリメント/デクリメントが無いらしい。イテレータがあるからあまり必要ないって。

多重代入 (p.108)
a, b = b, a

スワップ。やっぱり気持ち悪いなぁ。括弧ほしい。

多値
% irb
irb(main):001:0> a, *b = 1, 2, 3, 4, 5
=> [1, 2, 3, 4, 5]
irb(main):003:0> p a
1
=> nil
irb(main):004:0> p b
[2, 3, 4, 5]
=> nil

アスタリスク(*)で、配列を受けれるらしい

% irb
irb(main):001:0> array = [1, 2, 3]
=> [1, 2, 3]
irb(main):002:0> a, b, c = *array
=> [1, 2, 3]
irb(main):003:0> p a
1
=> nil
irb(main):004:0> p b
2
=> nil
irb(main):005:0> p c
3
=> nil

逆に右辺にアスタリスクを付けると、配列から受けれるらしい。これは面白い。

真理値 (p.110)

偽は nil と false。あとは真らしい。

case文 (p.115-p.116)

C言語族でいうところの switch。最初にマッチした条件のみを実行するらしい。Fall Through な switch よりもこっちのほうがいいね。

% irb
irb(main):001:0> a = 10
=> 10
irb(main):002:0> case a
irb(main):003:1> when 1 then
irb(main):004:1* puts "1"
irb(main):005:1> when 10 then
irb(main):006:1* puts "10"
irb(main):007:1> when 10, 11 then
irb(main):008:1* puts "10, 11"
irb(main):009:1> end
10
=> nil

あとは、こんな風に範囲指定にもマッチするらしい。変わってるなぁ。

% irb
irb(main):001:0> value = 3
=> 3
irb(main):002:0> case value
irb(main):003:1> when 0 then puts "0"
irb(main):004:1> when 1..9 then puts "1桁"
irb(main):005:1> when 10..99 then puts "2桁"
irb(main):006:1> end
1

こんな事ができるのは、case 文の比較では '===' という演算子が使われるかららしい。便利だけど、忘れないようにしないと何処かでハマりそうだなぁ。'==' を自前でオーバーライドした時とかやばそう。

後置 while (p.118)
% irb
irb(main):001:0> def more?
irb(main):002:1> gets.chomp !="ok"
irb(main):003:1> end
=> nil
irb(main):004:0> begin
irb(main):005:1* $stdout.print "満足したら'ok'と入力してください: "
irb(main):006:1> end while more?
満足したら'ok'入力してください: dsaf
満足したら'ok'入力してください: dsaf
満足したら'ok'入力してください: ok

まあこんな感じ。do while ではなく、begin/end の通常のブロックを使うみたい。

for文
% irb
irb(main):001:0> for i in [1, 2, 3] do
irb(main):002:1* puts i
irb(main):003:1> end
1
2
3
=> [1, 2, 3]

シェルっぽい書き方だけど、あんまり使わなくて、

irb(main):004:0> [1, 2, 3].each do |i|
irb(main):005:1* puts i
irb(main):006:1> end
1
2
3
=> [1, 2, 3]

こう書くのが ruby っぽいらしい。うーん、単純な繰り返しなら upto の方が好きかも。

% irb
irb(main):001:0> 1.upto(3) { |i| puts i }
1
2
3
=> 1

これで6章終了ですが、とりあえず何となく終った感じ。理解はまだまだ浅いなぁ...
7章に続く(多分)