It is often the case in object oriented programming you need to compare two objects to see if they are the same. Usually it just means doing a deeper comparison of the attributes on each object. Rakudo Perl 6 lets you create custom operators to make the actual comparison cleaner and reusable:

class User { has %.attrs }

multi sub infix:<==>(User $a, User $b --> Bool) {
  my @keys = $a.attrs.keys;
  return False unless @keys.elems == $b.attrs.keys.elems;

  for @keys -> $k {
    given $a.attrs{$k} {
      when Numeric { return False unless $a.attrs{$k} == $b.attrs{$k} }
      when Str     { return False unless $a.attrs{$k} eq $b.attrs{$k} }
      default      { say 'Unknown type: ' ~ $a.attrs{$k}.^name; die }
    }
  }

  True;
}

use Test;

my $fred = User.new(:attrs(id => 1, name => 'Fred'));
my $barney = User.new(:attrs(id => 2, name => 'Barney'));
nok $fred == $barney;

my $fred2 = User.new(:attrs(id => 1, name => 'Fred'));
ok $fred == $fred2;

   Page Updates
Install and setup snmpd on RedHat Enterprise Linux
Install and setup irssi and oidentd on Debian
ORM::ActiveRecord
Template::HAML
BDD::Behave
   Recent Articles
Install xfce4 on Debian
Console Blackjack in Perl
Selenium::WebDriver::Error::UnknownError
Game of Life in C++ using the SDL2
PigPen (dots and boxes) in C++ using the SDL2
   Tags
active-record (2) android (1) apt (1) awk (2) bash (2) bashrc (1) battleship (1) bdd (1) blackjack (12) book (1) books (1) build (1) c (2) c++ (2) cacti (1) capybara (1) clang (1) clang++ (1) console (5) cpp (2) crm (1) crystal (1) data (1) debian (7) diff (1) elixir (1) fedora (1) firewall (1) freebsd (1) g++ (1) game (4) games (1) gcc (1) gem (1) git (3) github (1) gmail (1) go-lang (3) google-chrome (1) haml (1) infix (1) irssi (1) kernel (3) latin1 (1) life (1) linux (4) lottery (1) meta (1) microsoft (1) moarvm (1) model (1) module (1) mongodb (1) mp3s (1) mutt (1) nautical (1) nqp (1) object (1) oidentd (1) operator (1) orm (2) pairing (1) pair-programming (1) patch (1) perl (1) pigpen (1) postgresql (2) powerball (1) programming (1) psql (1) python (2) python3 (1) raku (14) raspberrypi (1) reactjs (2) readline (1) reversi (1) rhel (1) ruby (1) sdl2 (4) sed (1) selenium (1) selinux (1) snmpd (1) split (1) ssh (1) stack (1) template (1) testing (3) tictactoe (1) trace (1) typescript (2) ubuntu (2) utf8 (1) virus (1) war (1) xargs (1) xfce4 (1) xvfb (1) zef (1)
   Twitter

Copyright © 2005 - 2020

GregDonald.com · Contact

All Rights Reserved