Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Optional return values

Reply
Thread Tools

Optional return values

 
 
Andreas Schwarz
Guest
Posts: n/a
 
      07-18-2007
Hi,

I have a few methods that check permissions, e.g.

unless user.can_view?(object)
puts "go away"
end

What I want do do now is add the possibility to give the caller more
information why the user doesn't have permission. I want to make it
backwards compatible, so returning [false, NotInGroupError(:group =>
'xyz')] is not an option. The only thing I could think of is giving the
function a String or Array that is modified in place:

def can_view?(object, message='')
if foo.bar
message.replace('some error message')
false
else
true
end
end

That's how one would have to do it in C or VHDL. It does seem kinda
un-rubyish though. Is there some obvious way to do this better that I'm
missing?

Thanks
Andreas

--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
 
 
 
Stefano Crocco
Guest
Posts: n/a
 
      07-18-2007
Alle mercoled=C3=AC 18 luglio 2007, Andreas Schwarz ha scritto:
> Hi,
>
> I have a few methods that check permissions, e.g.
>
> unless user.can_view?(object)
> puts "go away"
> end
>
> What I want do do now is add the possibility to give the caller more
> information why the user doesn't have permission. I want to make it
> backwards compatible, so returning [false, NotInGroupError(:group =3D>
> 'xyz')] is not an option. The only thing I could think of is giving the
> function a String or Array that is modified in place:
>
> def can_view?(object, message=3D'')
> if foo.bar
> message.replace('some error message')
> false
> else
> true
> end
> end
>
> That's how one would have to do it in C or VHDL. It does seem kinda
> un-rubyish though. Is there some obvious way to do this better that I'm
> missing?
>
> Thanks
> Andreas


I'do this:

def can_view?(object, more_info =3D false)
if foo.bar
more_info ? [false, 'message'] : false
else
more_info ? [true, nil] : true
end
end

If the user doesn't specify the second argument, then the method works as t=
he=20
original version, otherwise it returns an array whose first argument is tru=
e=20
or false and whose second argument is nil if the user has the perimission o=
r=20
the reason he doesn't if he doesn't (in the example above, I used a string,=
=20
but it can be anything, of course). The only drawback I can see with this=20
approach is that you can simply test the condition using

if can_view?(obj, true)
#...
but you need

if can_view?(obj,true)[0]
#...

I hope this helps

Stefano

 
Reply With Quote
 
 
 
 
Daniel DeLorme
Guest
Posts: n/a
 
      07-18-2007
Andreas Schwarz wrote:
> Hi,
>
> I have a few methods that check permissions, e.g.
>
> unless user.can_view?(object)
> puts "go away"
> end
>
> What I want do do now is add the possibility to give the caller more
> information why the user doesn't have permission. I want to make it
> backwards compatible, so returning [false, NotInGroupError(:group =>
> 'xyz')] is not an option.


Maybe turn it into a block?

user.cannot_view?(object) do |msg|
puts msg
end

Daniel

 
Reply With Quote
 
Robert Klemme
Guest
Posts: n/a
 
      07-18-2007
2007/7/18, Andreas Schwarz <(E-Mail Removed)>:
> Hi,
>
> I have a few methods that check permissions, e.g.
>
> unless user.can_view?(object)
> puts "go away"
> end
>
> What I want do do now is add the possibility to give the caller more
> information why the user doesn't have permission. I want to make it
> backwards compatible, so returning [false, NotInGroupError(:group =>
> 'xyz')] is not an option. The only thing I could think of is giving the
> function a String or Array that is modified in place:


I would not do that - that's plain awful for a language that has
multiple return values.

Some options I can think of that are better:

- create another method returning the reason
- use exceptions, i.e. do not check but simply do something and throw
if the permission is not granted (typically methods dealing with the
file system do it this way)
- create another method returning a boolean and a reason, but do not
use a question mark as last character in the identifier
- invert the logic, i.e. def permission_denied? which returns the
reason if forbidden and nil if granted (though I find this a bit
hackish)

I'd probably favor raising exceptions.

Kind regards

robert

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
What's your experience with optional values? DeMarcus C++ 24 01-14-2011 11:47 PM
Quotes Around Attribute Values - Optional? Jeremy S ASP .Net 6 06-15-2009 05:16 PM
what value does lack of return or empty "return;" return Greenhorn C Programming 15 03-06-2005 08:19 PM
macro with optional function calls and return value Capstar C Programming 1 08-18-2004 09:30 AM
Schema question regarding some mandatory/some optional values Piers Chivers XML 2 03-02-2004 09:49 AM



Advertisments