|
|
PV/ 891418
|
|
|
役立つリンク集 |
2008-06-09
{ } と do end の違い
Benchmark を使うときに
require 'benchmark' puts Benchmark::CAPTION puts Benchmark.measure { a = [1, 2, 3] a.replace [4, 5, 6] }
このように { } を使うのは OK なのに
{ } を do end に変えると
require 'benchmark' puts Benchmark::CAPTION puts Benchmark.measure do a = [1, 2, 3] a.replace [4, 5, 6] end
`measure': no block given (LocalJumpError)
ってエラーが出る。
{ } と do end って同じものだと思っていたけど何か違うみたいだ。
do...endと {...}で動作が異なる場合があります。
foobar a, b do .. end # foobar がブロック付きメソッドとして呼び出されます foobar a, b { .. } # b がブロック付きメソッドとして呼び出されますこれは{ }の方がdoブロックよりも結合強度が強いためです。
Ruby Reference Manual - るりま
どうやら結合強度が違うらしい。
ふむ。するってーとなんだい
さっきの Benchmark のスクリプトだと
puts Benchmark.measure { a = [1, 2, 3] a.replace [4, 5, 6] }
では Benchmark.measure に { } が渡されるのに
puts Benchmark.measure do a = [1, 2, 3] a.replace [4, 5, 6] end
これだと puts に do end が渡されるってことになるのかな?
試しに puts を除いてみる。
Benchmark.measure do a = [1, 2, 3] a.replace [4, 5, 6] end
エラーが出なくなった。
あーそうか。
`measure': no block given (LocalJumpError)
って「measure にブロックが渡されてません」ってことか。
Benchmark.measure
だと同じエラーになった。納得。
do end を使った場合、Benchmark.measure にブロックが渡されていないのは間違いないようだ。
きっと puts に渡されているんですね。
ところで、LocalJumpError ってなんぞ?と気になったので
LocalJumpError - Rubyリファレンスマニュアル
を少し読んでみたのだけどよく分からなかった。
スコープを出てしまった Proc からの return, break, retry で発生します。
って説明があるんだけどなんで上記の Benchmark のスクリプトで
このエラーが発生するのかよく分からない。
トラックバック - http://d.hatena.ne.jp/gan2/20080609/1212998482
リンク元
- 65 http://d.hatena.ne.jp/
- 15 http://reader.livedoor.com/reader/
- 11 http://www.kt.rim.or.jp/~kbk/zakkicho/index.html
- 9 http://www.kt.rim.or.jp/~kbk/zakkicho/
- 7 http://xucker2000.blogspot.com/2006/04/youtubeflvmp3ffmpeg.html
- 5 http://d.hatena.ne.jp/keyworddiary/ruby
- 5 http://fastladder.com/reader/
- 4 http://bookmarks.yahoo.co.jp/bookmarklet/showpopup?t=gnuserv を使って Meadow で様々なファイルを開く - gan2 の Ruby 勉?
- 4 http://search.yahoo.co.jp/search?p=wmpでflv&search.x=1&fr=top_ga1&tid=top_ga1&ei=UTF-8
- 4 http://www.google.co.jp/reader/view/