"Sam McCall" <tunah.usenet / tunah.net> schrieb im Newsbeitrag news:1092816068.68668 / drone1-svc-skyt.qsi.net.nz... > These don't seem orthogonal. It feels like I should be able to do > obj.meth do |x| > #... > rescue SomeException => ex > #... > end > > and that either begin should be something like a Kernel method: > > def begin > yield > end > > (although maybe with optional "do"), or blocks could be standalone > expressions if not part of a method call (this doesn't _seem_ to cause > ambiguity, but someone cleverer could probably find some). > So I could do > > do > #... > rescue SomeException => ex > #... > end > > which behaves just like "begin", and I wouldn't have to use blocks in > some places (iterator methods) and begin/end in others (builtin control > structures): > > do x.foo; x.bar; end if x.baz? , or > { x.foo; x.bar } if x.baz? > instead of > begin x.foo; x.bar; end if x.baz? > > The syntax difference between iterators and builtin control structures > (need the do), and the fact that one checks for require blocks and one > doesn't, still rub me the wrong way a bit: > while(foo) ... end > but > loop do ... end > ^^ > I don't want to know if it's a builtin or an iterator. > > What do people think? I hope I'm completely wrong, and it makes perfect > sense... and someone can explain it :-) Two things come to mind: - AFAIR there was a discussion about this some time ago here - this issue might be related to block scoping rules, currently you can introduce a local in a block but AFAIK begin-end does not introduce a separate scope (note also, that block scoping will change in Ruby 2) $ ruby -e 'begin; foo="foo"; end;puts foo' foo Robert@Babelfish2 ~ $ ruby -e 'def t;yield;end; t { foo="foo" } ; puts foo' -e:1: undefined local variable or method `foo' for main:Object (NameError) Kind regards robert