[#41431] [ruby-trunk - Bug #5694][Open] Proc#arity doesn't take optional arguments into account. — Marc-Andre Lafortune <ruby-core@...>

27 messages 2011/12/01
[#41442] [ruby-trunk - Bug #5694] Proc#arity doesn't take optional arguments into account. — Thomas Sawyer <transfire@...> 2011/12/01

[#41443] Re: [ruby-trunk - Bug #5694] Proc#arity doesn't take optional arguments into account. — Yehuda Katz <wycats@...> 2011/12/01

Maybe we can add a new arity_range method that does this?

[#41496] [ruby-trunk - Bug #5714][Open] Unexpected error of STDIN#read with non-ascii input on Windows XP — Heesob Park <phasis@...>

22 messages 2011/12/06

[#41511] [ruby-trunk - Bug #5719][Open] Hash::[] can't handle 100000+ args — Nick Quaranto <nick@...>

13 messages 2011/12/07

[#41557] [ruby-trunk - Bug #5730][Open] Optinal block parameters assigns wrong — Yukihiro Matsumoto <matz@...>

14 messages 2011/12/08

[#41586] [ruby-trunk - Feature #5741][Open] Secure Erasure of Passwords — Martin Bosslet <Martin.Bosslet@...>

17 messages 2011/12/10

[#41672] [ruby-trunk - Feature #5767][Open] Cache expanded_load_path to reduce startup time — Yura Sokolov <funny.falcon@...>

13 messages 2011/12/15

[#41681] Documentation of the language itself (syntax, meanings, etc) — Rodrigo Rosenfeld Rosas <rr.rosas@...>

Since Ruby is built on top of simple concepts, most of the documentation

23 messages 2011/12/15
[#41683] Re: Documentation of the language itself (syntax, meanings, etc) — Gary Wright <gwtmp01@...> 2011/12/15

[#41686] Re: Documentation of the language itself (syntax, meanings, etc) — Rodrigo Rosenfeld Rosas <rr.rosas@...> 2011/12/16

Em 15-12-2011 19:23, Gary Wright escreveu:

[#41717] Feature : optional argument in File.join — Michel Demazure <michel@...>

In Windows, when using File.join, one often ends with a path containing

13 messages 2011/12/19
[#41719] Re: Feature : optional argument in File.join — Luis Lavena <luislavena@...> 2011/12/19

On Mon, Dec 19, 2011 at 6:09 AM, Michel Demazure <michel@demazure.com> wrot=

[#41720] Re: Feature : optional argument in File.join — Michel Demazure <michel@...> 2011/12/19

Luis Lavena wrote in post #1037331:

[#41728] [ruby-trunk - Feature #5781][Open] Query attributes (attribute methods ending in `?` mark) — Thomas Sawyer <transfire@...>

15 messages 2011/12/19

[#41799] Best way to separate implementation specific code? — Luis Lavena <luislavena@...>

Hello,

15 messages 2011/12/24
[#41800] Re: Best way to separate implementation specific code? — KOSAKI Motohiro <kosaki.motohiro@...> 2011/12/24

2011/12/24 Luis Lavena <luislavena@gmail.com>:

[#41811] Re: Best way to separate implementation specific code? — "U.Nakamura" <usa@...> 2011/12/26

Hello,

[#41817] Re: Best way to separate implementation specific code? — Luis Lavena <luislavena@...> 2011/12/26

On Sun, Dec 25, 2011 at 10:51 PM, U.Nakamura <usa@garbagecollect.jp> wrote:

[#41812] [ruby-trunk - Feature #5809][Open] Benchmark#bm: remove the label_width parameter — Benoit Daloze <redmine@...>

11 messages 2011/12/26

[ruby-core:41683] Re: Documentation of the language itself (syntax, meanings, etc)

From: Gary Wright <gwtmp01@...>
Date: 2011-12-15 21:23:55 UTC
List: ruby-core #41683
On Dec 15, 2011, at 11:58 AM, Rodrigo Rosenfeld Rosas wrote:

> For instance, I wanted to know if this is possible:
>=20
> class MyViewRenderer < DefaultRender # DefaultRender defines the =
'render' method
>  def list
>    render_and_return[view: 'not_allowed'] unless allowed?
>    render view: 'list' # shouldn't get called
>  end
>=20
>  protected
>=20
>  def render_and_return
>    proc {|*args| render *args; return }
>  end
>=20
>  def allowed?
>    false
>  end
> end
>=20
> Yeah, I know several folks will point me out that I should be using =
catch-throw for achieving something like this, but that is not the =
point.

Catch-throw?  I remember reading about that but I'll bet it is one of =
the least used parts of Ruby.

The return keyword in a block or in a simple proc (but not in a lambda) =
always returns from the method in which it is lexically embedded.  In =
your example this means that 'return' is associated with the method =
render_and_return.  If you invoke the proc returned by =
render_and_return, you get an error because the associated method is not =
active when the return is executed.

Note:  This all assumes you are using Ruby 1.9.X where the proc method =
creates a simple proc and not a lambda.  If you try your example in Ruby =
1.8.X you won't get an error since you'll be calling a lambda and =
'return' in a lambda simply ends execution of the block (and *not* the =
enclosing method).

> What I'm saying is that I can't find any official reference about the =
meanings of "return", "next" or "break", for instance. Nor can I find =
the reason why such construction is not allowed.


This is discussed in _The_Ruby_Programming_Language_ by David Flanagan =
and Matz, which I consider to be more in the style of a programming =
reference manual than the more commonly referenced Pickaxe book by Dave =
Thomas (_Programming_Ruby_).  I believe you are correct that there is no =
commonly referenced online 'official' language definition.  There is the =
following ISO draft: =
<http://www.ipa.go.jp/osc/english/ruby/Ruby_final_draft_enu_20100825.pdf> =
but I don't think its description of 'return' is very helpful and the =
entire spec is out of date relative to language as defined by MRI 1.9.3.

> So, what is the reason why the proc with a return can only be called =
inside the method that created it?

Why it behaves this way gets more into the philosophy of language =
design. With your proposed semantics it isn't possible to look at the =
source code and understand that the proc will cause a return from list() =
while the current semantics of 'return' do let you look at the source =
and know what method will terminate execution because of the return.

The code you seem to want to avoid seems simple enough though.  Making =
an explicit return implicit doesn't seem like an improvement to me.  =
What is wrong with:

def list
  if allowed?
     render view: 'list'
  else
     render view: 'not_allowed'
  end
end

or

def list
  view =3D allowed? ? 'list' : 'not_allowed'
  render view: view
end



Gary Wright=

In This Thread