> On 30 Apr 2018, at 15:04, ToddAndMargo <[email protected]> wrote:
>
> Hi All,
>
> I am confused.
>
> With this sub:
>
> sub odd( $Num ) { return $Num % 2; }
>
>
> Why does this work:
>
> if odd $LineNum
> { $PartsStr ~= '<font color="#006600">'; } # Green
> else { $PartsStr ~= '<font color="#663366">'; } # Purple
>
> And this one throw an error:
>
> if $LineNum.odd
> { $PartsStr ~= '<font color="#006600">'; } # Green
> else { $PartsStr ~= '<font color="#663366">'; } # PurpleNo
>
> No such method 'odd' for invocant of type 'Int'. Did
> you mean 'ord'?
>
> What is my misunderstanding?
I think you’re confusing Perl 5 with Perl 6. In Perl 5, a method is just a sub
that happens to accept the object as the first parameter.
Although this is also true on a much lower level in Perl 6, at this level this
is *not* true.
So, this is *not* a compilation error:
class Foo {
sub bar {}
method bar {}
}
So the error is correct: there *is* not method “odd” in the class Int. There’s
only a sub called “odd” in your package.
Now, if you wanted to, you *could* mix in a “odd” method into an Int, but that
is cumbersome because it needs to be done to each value you want to work with.
You can also use the subset approach for ad-hoc type checking:
subset Even of Int where * %% 2;
say 42 ~~ Even; # True
say 43 ~~ Even; # False
Use the power :-)