Базовая реализация не должна быть классом дел. Просто сделайте это признаком, и тогда все ваши кейс-классы смогут его расширить.
trait Stringification { self: Product =>
override def toString() =
getClass.getDeclaredFields
.zip(productIterator.toSeq)
.map { case (a, b) => s"${a.getName}=$b" }
.mkString("\n")
}
, а затем
case class Foo(foo: String, bar: Int) extends Stringification
case class Bar(foo: Foo, bar: String) extends Stringification
... и т. Д.
unless (caller) {
print "This is the script being executed\n";
}
Посмотрите вызывающую сторону. Это возвращается undef
в основном сценарии. Обратите внимание, что это не работает в подпрограмме, только в коде верхнего уровня.
Посмотрите "Подклассы для Приложений (Глава 18)" часть brian d статья Five Ways to Improve Your Perl Programming foy.
unless caller
хорошо, но более прямая параллель, а также более явная проверка:
use English qw<$PROGRAM_NAME>;
if ( $PROGRAM_NAME eq __FILE__ ) {
...
}
Просто мысль я поместил это там.
Править
Следует иметь в виду это $PROGRAM_NAME
(или'$0
'), перезаписываемо, таким образом, это не абсолютно. Но, в большей части практики - за исключением несчастного случая или неистовствующих модулей - это, вероятно, не будет изменено или изменено самое большее локально в другом объеме.