メンバー関数
- 中間値が負になる可能性があるため、
decrement()
はincrement()
よりも少し複雑になる。struct TimeOfDay {
 // ...

 void decrement(Duration duration) {
 auto minutesToSubtract = duration.minute % 60;
 auto hoursToSubtract = duration.minute / 60;

 minute -= minutesToSubtract;

 if (minute < 0) {
 minute += 60;
 ++hoursToSubtract;
 }

 hour -= hoursToSubtract;

 if (hour < 0) {
 hour = 24 - (-hour % 24);
 }
 }

 // ...
}
toString()
メンバー関数を使用すると、どれほど簡単になるかを確認するために、info()
のオーバーロードであるMeeting
をもう一度見てみよう。void info(Meeting meeting) {
 info(meeting.start);
 write('-');
 info(meeting.end);

 writef(" \"%s\" meeting with %s attendees",
 meeting.topic,
 meeting.attendanceCount);
}
すでに定義されている
TimeOfDay.toString
を利用することで、Meeting.toString
の実装はごく簡単になる。string toString() {
 return format("%s-%s \"%s\" meeting with %s attendees",
 start, end, topic, attendanceCount);
}
以下にプログラム全体を示す:
import std.stdio;
import std.string;

struct Duration {
 int minute;
}

struct TimeOfDay {
 int hour;
 int minute;

 string toString() {
 return format("%02s:%02s", hour, minute);
 }

 void increment(Duration duration) {
 minute += duration.minute;

 hour += minute / 60;
 minute %= 60;
 hour %= 24;
 }
}

struct Meeting {
 string topic;
 int attendanceCount;
 TimeOfDay start;
 TimeOfDay end;

 string toString() {
 return format("%s-%s \"%s\" meeting with %s attendees",
 start, end, topic, attendanceCount);
 }
}

struct Meal {
 TimeOfDay time;
 string address;

 string toString() {
 TimeOfDay end = time;
 end.increment(Duration(90));

 return format("%s-%s Meal, Address: %s",
 time, end, address);
 }
}

struct DailyPlan {
 Meeting amMeeting;
 Meal lunch;
 Meeting pmMeeting;

 string toString() {
 return format("%s\n%s\n%s",
 amMeeting,
 lunch,
 pmMeeting);
 }
}

void main() {
 auto bikeRideMeeting = Meeting("Bike Ride", 4,
 TimeOfDay(10, 30),
 TimeOfDay(11, 45));

 auto lunch = Meal(TimeOfDay(12, 30), "İstanbul");

 auto budgetMeeting = Meeting("Budget", 8,
 TimeOfDay(15, 30),
 TimeOfDay(17, 30));

 auto todaysPlan = DailyPlan(bikeRideMeeting,
 lunch,
 budgetMeeting);

 writeln(todaysPlan);
 writeln();
}
プログラムの出力は、
info()
関数のオーバーロードを使用した前のプログラムと同じだ。10:30-11:45 "自転車ツアー"ミーティング(参加者4名) 12:30-14:00 昼食、場所: イスタンブール 15:30-17:30 "予算"ミーティング(参加者8名)