「初めての 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 コラム)
単項のインクリメント/デクリメントが無いらしい。イテレータがあるからあまり必要ないって。
多値
% 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章に続く(多分)