[Koha-devel] Bug 18539 - Forbid Koha::Objects->find calls in list context

Julian Maurice julian.maurice at biblibre.com
Wed Dec 13 15:56:35 CET 2017


Probably, but that's not my point.

I understand why the previous code needed to be fixed, which is to avoid
that

{ a => Koha::Patrons->find("foo"), b => "bar" }

would result in { a => "b", "bar" => undef }

My question is: why the solution to this problem was to forbid calls in
list context while we could simply return an explicit undef?
It forces us to write 'scalar' in front of a call that should always
return a single value, and in my opinion it's a "code smell"

Le 13/12/2017 à 15:29, Marcel de Rooy a écrit :
> i forgot to add scalar in the second..
> 
> probably you should
> 
> if( $a = xxx->find )
> 
>    push @b, $a
> 
> 
> ------------------------------------------------------------------------
> *Van:* Julian Maurice <julian.maurice at biblibre.com>
> *Verzonden:* woensdag 13 december 2017 15:20:34
> *Aan:* Marcel de Rooy
> *Onderwerp:* Re: [Koha-devel] Bug 18539 - Forbid Koha::Objects->find
> calls in list context
>  
> This particular line will work (only the first, in the second, find is
> still called in list context), but @a would contain one element (undef)
> and the example code given by Jonathan will also fail, whether we call
> find in list context or not.
> 
> Le 13/12/2017 à 15:12, Marcel de Rooy a écrit :
>> Are you sure ?
>> 
>> push @a, scalar Koha..->find
>> 
>> or @a = ( ...->find )
>> 
>> 
>> should work imo
>> 
>> ------------------------------------------------------------------------
>> *Van:* koha-devel-bounces at lists.koha-community.org
>> <koha-devel-bounces at lists.koha-community.org> namens Julian Maurice
>> <julian.maurice at biblibre.com>
>> *Verzonden:* woensdag 13 december 2017 15:07:11
>> *Aan:* Jonathan Druart
>> *CC:* koha-devel at lists.koha-community.org
>> *Onderwerp:* Re: [Koha-devel] Bug 18539 - Forbid Koha::Objects->find
>> calls in list context
>>  
>> Ok, but the proposed fix doesn't fix this code:
>> 
>> @a = scalar Koha::Patrons->find('foo');
>> if (@a) { # still equals to 1
>>   say $a[0]->borrowernumber; # still BOOM
>> }
>> 
>> And yes, that was the link ;)
>> 
>> Le 13/12/2017 à 14:58, Jonathan Druart a écrit :
>>> Hi Julian,
>>> 
>>> 
>>>> @a = Koha::Patrons->find('foo'); # would result in @a = (undef)
>>> 
>>> And that leads to issues:
>>> if ( @a ) { # = 1
>>>   say $a[0]->borrowernumber; # BOOM
>>> }
>>> 
>>> See also https://perlmaven.com/how-to-return-undef-from-a-function (was
>>> it the link you were talking about?)
>>> 
>>> Cheers,
>>> Jonathan
>>> 
>>> On Wed, 13 Dec 2017 at 10:34 Julian Maurice <julian.maurice at biblibre.com
>>> <mailto:julian.maurice at biblibre.com>> wrote:
>>> 
>>>     Hi developers,
>>> 
>>>     I stumbled upon a line of code recently and I can't figure out why it
>>>     has be done this way. I hope you can help me :)
>>> 
>>>     The line in question is in Koha::Objects::find:
>>> 
>>>         croak 'Cannot use "->find" in list context' if wantarray;
>>> 
>>>     I read the two bugs (18539 and 18179) and the link given by Jonathan but
>>>     I still don't understand why the call in list context has been
>>>     forbidden. Why not simply return undef (an explicit undef) when no
>>>     records have be found ? It would work as expected in scalar and list
>>>     contexts.
>>> 
>>>     Here is a possible rewrite of 'find' to better explain what I mean:
>>> 
>>>         sub find {
>>>             my ( $self, @pars ) = @_;
>>> 
>>>             my $object = undef;
>>> 
>>>             @pars = grep { defined } @pars;
>>>             if (@pars) {
>>>                 my $result = $self->_resultset()->find(@pars);
>>>                 if ($result) {
>>>                     $object =
>>>     $self->object_class()->_new_from_dbic($result);
>>>                 }
>>>             }
>>> 
>>>             return $object;
>>>         }
>>> 
>>>     @a = Koha::Patrons->find('foo'); # would result in @a = (undef)
>>>     {a => K::P->find('foo'), b => 'bar'}; # would result in {a => undef, b
>>>     => 'bar'}
>>> 
>>>     Please tell me what you think.
>>> 
>>>     --
>>>     Julian Maurice <julian.maurice at biblibre.com
>>>     <mailto:julian.maurice at biblibre.com>>
>>>     BibLibre
>>>     _______________________________________________
>>>     Koha-devel mailing list
>>>     Koha-devel at lists.koha-community.org
>>>     <mailto:Koha-devel at lists.koha-community.org>
>>>     http://lists.koha-community.org/cgi-bin/mailman/listinfo/koha-devel
>>>     website : http://www.koha-community.org/
>>>     git : http://git.koha-community.org/
>>>     bugs : http://bugs.koha-community.org/
>>> 
>> 
>> -- 
>> Julian Maurice <julian.maurice at biblibre.com>
>> BibLibre
>> _______________________________________________
>> Koha-devel mailing list
>> Koha-devel at lists.koha-community.org
>> http://lists.koha-community.org/cgi-bin/mailman/listinfo/koha-devel
>> website : http://www.koha-community.org/
>> git : http://git.koha-community.org/
>> bugs : http://bugs.koha-community.org/
> 
> -- 
> Julian Maurice <julian.maurice at biblibre.com>
> BibLibre

-- 
Julian Maurice <julian.maurice at biblibre.com>
BibLibre


More information about the Koha-devel mailing list