Ruby勉強会@札幌-22に参加しました

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"

懇親会

国際交流と日本酒とジンギスカン、最高でした。
P2112127

また次回もよろしくおねがいします!

2 comments:

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください