Beefy Boxes and Bandwidth Generously Provided by pair Networks
Welcome to the Monastery
 
PerlMonks  

Re^2: Hope a subroutine will return undef by default

by tobyink (Abbot)
on Feb 11, 2014 at 22:59 UTC ( #1074532=note: print w/ replies, xml ) Need Help??


in reply to Re: Hope a subroutine will return undef by default
in thread Hope a subroutine will return undef by default

I'm starting to prefer simply adding this to the end of the sub:

();
use Moops; class Cow :rw { has name => (default => 'Ermintrude') }; say Cow->new->name


Comment on Re^2: Hope a subroutine will return undef by default
Download Code
Re^3: Hope a subroutine will return undef by default
by LanX (Canon) on Feb 11, 2014 at 23:04 UTC
    well if you really wanna "golf" better skip the semicolon and safe 33% of the necessary characters. ;-)

    Cheers Rolf

    ( addicted to the Perl Programming Language)

      My main concern is not one of brevity. The return keyword does two things: it establishes the return value of the function, and it also acts as flow-control, exiting the current function.

      (); is a way to set the return value of a function to nothing without using a keyword that screams out "flow-control" to readers skimming the code.

      Update: As an aside, in Kavorka there is a lot of Perl code re-writing that goes on. For example, writing something like this:

      method foo ($x) { return $x + 1; }

      Will actually be rewritten internally to something like:

      sub foo { my $self = shift; my $x = @_>=1 ? shift(@_) : croak("Requires \$x"); return $x + 1; }

      So far, so good. But what about this method:

      method bar ($x) { }

      We'd expect it to return nothing. But it's rewritten to something like:

      sub bar { my $self = shift; my $x = @_>=1 ? shift(@_) : croak("Requires \$x"); }

      Which would actually return $x! The solution? Kavorka inserts (); into the sub body after unpacking parameters from @_. It couldn't use return because that's flow-control, and would prevent the main body of the function from executing.

      use Moops; class Cow :rw { has name => (default => 'Ermintrude') }; say Cow->new->name
        IMHO its still flow control (its an exit point), so no need to hide it.

        (); is fine for short lambdas, otherwise IMHO explicit is better than implicit.

        YMMV! :)

        Cheers Rolf

        ( addicted to the Perl Programming Language)

      It is a good habit to omit semicolons after the commands that should not be followed by anything else (return, next, etc.). If you accidentaly add something, you get an error.
      لսႽ ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1074532]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others studying the Monastery: (9)
As of 2015-07-06 14:48 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (75 votes), past polls