1223f33ba21df7d6aa98e866a9cee55a00522b5c
Perl/Object-Simple.md
... | ... | @@ -0,0 +1,188 @@ |
1 | +[[_TOC_]]
|
|
2 | +
|
|
3 | +# 概要
|
|
4 | +- [MetaCPAN:Object::Simple](https://metacpan.org/pod/Object::Simple) を利用したオブジェクト指向プログラミングのサンプル。
|
|
5 | +
|
|
6 | +# 継承
|
|
7 | +- Point クラスを継承した Point3D クラスには、追加のプロパティ(z)と追加されたプロパティが影響する部分のみを実装する。
|
|
8 | +- new(), stringify(), abs() については継承元の Point クラスのメソッドが呼び出される。
|
|
9 | +
|
|
10 | +## ソース
|
|
11 | +- Point.pm
|
|
12 | + ```perl
|
|
13 | + package Point;
|
|
14 | +
|
|
15 | + use Object::Simple -base;
|
|
16 | + use overload '""' => \&stringify;
|
|
17 | +
|
|
18 | + has label => '';
|
|
19 | + has x => 0;
|
|
20 | + has y => 0;
|
|
21 | +
|
|
22 | + sub stringify {
|
|
23 | + my $self = shift;
|
|
24 | + return sprintf( '[%s](%s)', $self->label, join( ', ', $self->values ) );
|
|
25 | + }
|
|
26 | +
|
|
27 | + sub values {
|
|
28 | + my $self = shift;
|
|
29 | + return ( $self->x, $self->y );
|
|
30 | + }
|
|
31 | +
|
|
32 | + sub clear {
|
|
33 | + my $self = shift;
|
|
34 | + $self->x(0);
|
|
35 | + $self->y(0);
|
|
36 | + }
|
|
37 | +
|
|
38 | + sub abs {
|
|
39 | + my $self = shift;
|
|
40 | + my $sum = 0;
|
|
41 | + map { $sum += $_ * $_ } $self->values;
|
|
42 | + return sqrt($sum);
|
|
43 | + }
|
|
44 | +
|
|
45 | + 1;
|
|
46 | + ```
|
|
47 | +
|
|
48 | +- Point3D.pm
|
|
49 | + ```perl
|
|
50 | + package Point3D;
|
|
51 | +
|
|
52 | + use Object::Simple 'Point';
|
|
53 | +
|
|
54 | + has z => 0;
|
|
55 | +
|
|
56 | + sub values {
|
|
57 | + my $self = shift;
|
|
58 | + return ( $self->SUPER::values, $self->z );
|
|
59 | + }
|
|
60 | +
|
|
61 | + sub clear {
|
|
62 | + my $self = shift;
|
|
63 | + $self->SUPER::clear;
|
|
64 | + $self->z(0);
|
|
65 | + }
|
|
66 | +
|
|
67 | + 1;
|
|
68 | + ```
|
|
69 | +
|
|
70 | +- use-Point.pl
|
|
71 | + ```perl
|
|
72 | + #!/bin/perl
|
|
73 | + # [GitHub:yuki-kimoto/Object-Simple](https://github.com/yuki-kimoto/Object-Simple)
|
|
74 | +
|
|
75 | + use strict;
|
|
76 | + use warnings;
|
|
77 | + use utf8;
|
|
78 | + use Encode;
|
|
79 | + use Point;
|
|
80 | + use Point3D;
|
|
81 | + use open ':std' => ':locale';
|
|
82 | +
|
|
83 | + print "\n# Point サンプル\n";
|
|
84 | + my $pointA = Point->new(
|
|
85 | + label => '点A',
|
|
86 | + x => 3,
|
|
87 | + y => 4,
|
|
88 | + );
|
|
89 | + print "${pointA}\n";
|
|
90 | + print "x: " . $pointA->x . "\n";
|
|
91 | + print "abs: " . $pointA->abs . "\n";
|
|
92 | + $pointA->y(9.3);
|
|
93 | + print "${pointA}\n";
|
|
94 | + $pointA->clear;
|
|
95 | + print "${pointA}\n";
|
|
96 | +
|
|
97 | + print "\n# Point3D サンプル\n";
|
|
98 | + my $pointB = Point3D->new(
|
|
99 | + label => '点B',
|
|
100 | + x => 3,
|
|
101 | + y => 4,
|
|
102 | + z => 5,
|
|
103 | + );
|
|
104 | + print "${pointB}\n";
|
|
105 | + print "z: " . $pointB->z . "\n";
|
|
106 | + print "abs: " . $pointB->abs . "\n";
|
|
107 | + $pointB->z(9.6);
|
|
108 | + print "${pointB}\n";
|
|
109 | + $pointB->clear;
|
|
110 | + print "${pointB}\n";
|
|
111 | +
|
|
112 | + exit;
|
|
113 | + ```
|
|
114 | +
|
|
115 | +## 出力
|
|
116 | +```
|
|
117 | +# Point サンプル
|
|
118 | +[点A](3, 4)
|
|
119 | +x: 3
|
|
120 | +abs: 5
|
|
121 | +[点A](3, 9.3)
|
|
122 | +[点A](0, 0)
|
|
123 | +
|
|
124 | +# Point3D サンプル
|
|
125 | +[点B](3, 4, 5)
|
|
126 | +z: 5
|
|
127 | +abs: 7.07106781186548
|
|
128 | +[点B](3, 4, 9.6)
|
|
129 | +[点B](0, 0, 0)
|
|
130 | +```
|
|
131 | +
|
|
132 | +# インラインモジュール
|
|
133 | +- 同一ファイル内でモジュールを定義する場合は、main ルーチンを実行する前にモジュール部分を実行しないとモジュールが正常に初期化されない。
|
|
134 | +- main ルーチンより先にモジュール部分を実行するには、下記のいずれかを行う。
|
|
135 | + - main ルーチンの前でモジュール部分を定義する。
|
|
136 | + - main ルーチンを関数化し、モジュール定義後に main() を呼び出す。
|
|
137 | + - BEGIN ブロック内にモジュール定義を配置する。
|
|
138 | +
|
|
139 | +## ソース
|
|
140 | +- inlineModule.pl
|
|
141 | + ```perl
|
|
142 | + #!/bin/perl
|
|
143 | +
|
|
144 | + use strict;
|
|
145 | + use warnings;
|
|
146 | + use utf8;
|
|
147 | + use Encode;
|
|
148 | + use open ':std' => ':locale';
|
|
149 | +
|
|
150 | + my $user = User->new(
|
|
151 | + id => '0001',
|
|
152 | + account => 'TaroY',
|
|
153 | + displayname => '山田 太郎',
|
|
154 | + );
|
|
155 | + print "${user}\n";
|
|
156 | +
|
|
157 | + exit;
|
|
158 | +
|
|
159 | + BEGIN {
|
|
160 | +
|
|
161 | + package User {
|
|
162 | + use Object::Simple -base;
|
|
163 | + use overload '""' => \&stringify;
|
|
164 | +
|
|
165 | + has id => '';
|
|
166 | + has account => '';
|
|
167 | + has displayname => '';
|
|
168 | +
|
|
169 | + sub stringify {
|
|
170 | + my $self = shift;
|
|
171 | + return sprintf( '{id:"%s", account:"%s", displayname:"%s"}',
|
|
172 | + $self->id, $self->account, $self->displayname );
|
|
173 | + }
|
|
174 | + }
|
|
175 | + }
|
|
176 | + ```
|
|
177 | +
|
|
178 | +## 出力
|
|
179 | +```
|
|
180 | +{id:"0001", account:"TaroY", displayname:"山田 太郎"}
|
|
181 | +```
|
|
182 | +
|
|
183 | +# リンク
|
|
184 | +- [MetaCPAN:Object::Simple](https://metacpan.org/pod/Object::Simple) Simplest class builder, Mojo::Base porting, fast and less memory
|
|
185 | + - [GitHub:yuki-kimoto/Object-Simple](https://github.com/yuki-kimoto/Object-Simple) Simplest class builder, Mojo::Base porting, fast and less memory
|
|
186 | + - [Object::Simple](http://d.hatena.ne.jp/perlcodesample/20160912/1473688503) 簡単すぎるクラスビルダー、Mojo::Baseの移植、速くて省メモリ【日本語訳】 - Perlゼミ(サンプルコードPerl入門)
|
|
187 | +
|
|
188 | +- [MetaCPAN:overload](https://metacpan.org/pod/overload) Package for overloading Perl operations
|
Perl/_Sidebar.md
... | ... | @@ -29,6 +29,7 @@ |
29 | 29 | - [[MySQL-BIT]]
|
30 | 30 | - [[NetWatcher]]
|
31 | 31 | - [[nicoget]]
|
32 | +- [[Object-Simple]]
|
|
32 | 33 | - [[packBit]]
|
33 | 34 | - [[Perl-Tidy]]
|
34 | 35 | - [[readXSV]]
|