2月11日に開催されたRuby勉強会@札幌-22に参加しました。
今回はオーストラリアよりアンドリュー グリムさんを迎えての勉強会でした!
初めてのRuby読み合わせ
今回は6.3.5 for式からでした。
覚えたこと
6.3.5 for式
for と each のスコープの違いについて。eachはブロック内で定義した変数のスコープはブロック内だけだけど、forの場合はブロックの外側でも変数を参照できる。
for i in [1,2,3] do a = "hello" end puts a // できる
[1,2,3].each do |i| b = "hi!!" end puts b // NameError: undefined local variable or method `b' for main:Object
このため、ループ内でlumbdaを定義した時の実行結果も変わる
a = []
for i in [1,2,3] do
a << lambda{puts i}
end
a.map{|e| e.call}
--
3
3
3
b = []
[1,2,3].each do |i|
b << lambda{puts i}
end
b.map{|e| e.call}
--
1
2
3
こうして比べてみるとiが定義されている場所が違うんだな。なるほど。
みんなforはほとんど使わないみたいだった。
6.3.6 イテレータ
rubyにはいろいろな繰り返し処理の方法がある
- loop: 無限ループを提供
- n.times: n回繰り返す
- n.upto(m): nからmまでカウントアップ
- n.downto(m): nからmまでカウントダウン
- n.step(m, x): nからmまでxずつ増やす/減らす
カウントアップとカウントダウンは n < m (upto), n > m (downto) となっていないと実行されない。
6.3.7 脱出
break, next, redo.
Javaのbreak + ラベルを使う話がでました。実際ラベルを使った事がほとんどなかったのですっかり忘れていました。
ループを一気に抜けるため、にあるのかな?つかわないけど。
pythonの loop else は何のためにある?という話題もでました。
次回は6.4例外処理からです。
アンドリューさんのお話
[1,2,3].map(&1.method(:+))
という書き方ができるよ、と言う話。
関数の部分適用というらしい。
["9","1","2"].map(&method(:Integer)) => [9, 1, 2]
class MyClass
def to_proc
puts "to_proc called"
Proc.new{puts "doing something"}
end
end
m = MyClass.new
1.times(&m)
--
to_proc called
doing something
こんな順番で説明をしてくれました。
1というオブジェクトの+メソッドを[1,2,3]に適用させている。
・・・・ようなのだけど、話を聞いている時はなるほどと思っていたのだが、難しくて説明できません。
誰か教えてください(;_;)
source_loactionの使い方とto_iとmethod(:Integer)の違いは理解した。
"a".to_i => 0
Integer("b")
// ArgumentError: invalid value for Integer(): "b"
懇親会
また次回もよろしくおねがいします!

[1,2,3].map {|x| 1 + x } と同じ意味
mrkn
ありがとうございます!
同じ意味になるのはわかるのだけど、どこがどう作用してそうなるのか、勉強会ではわかったつもりだったのだけど、帰ってみたら理解できていない事に気がついた・・・ (-_-)