Если я правильно понимаю ваш сценарий использования, вы можете использовать класс типов Cats по умолчанию Show
или, если вам нужно больше настраиваемого поведения, вы можете напрямую использовать обобщенную деривацию с помощью Shapeless
для достижения того, что вам нужно.
Для более легкого сценария Cat Show
читайте здесь .
Как вы можете читать, он имеет синтаксис, который позволит вам сделать myObject.show
для любого T
, который имеет Show[T]
в области видимости.
Если вы хотите более настраиваемое поведение, вы можете попробовать перейти непосредственно к Shapeless. Пример того, что вам нужно, можно найти в в этом примере Show
type-class , и вы можете увидеть, что он работает здесь .
С учетом этих классов дел:
sealed trait Super
case class Foo(i: Int, s: String) extends Super
case class Bar(i: Int) extends Super
case class BarRec(i: Int, rec: Super) extends Super
sealed trait MutualA
case class MutualA1(x: Int) extends MutualA
case class MutualA2(b: MutualB) extends MutualA
sealed trait MutualB
case class MutualB1(x: Int) extends MutualB
case class MutualB2(b: MutualA) extends MutualB
Будет напечатано:
Bar(i = 0)
BarRec(i = 1, rec = Foo(i = 0, s = foo))
MutualA2(b = MutualB2(b = MutualA1(x = 0)))
rm -- --testings.html
--
опция говорит комнате рассматривать все дальнейшие аргументы как имена файлов, не как опции, даже если они запускают с -
.
Это не конкретно к команде комнаты. Функция getopt реализует его, и многие (все?) команды стиля UNIX рассматривают его тот же путь: --
завершает обработку опции и что-либо после того, как это будет регулярный аргумент.
http://www.gnu.org/software/hello/manual/libc/Using-Getopt.html#Using-Getopt
rm -- --somefile
В то время как это работает, это - решение, которое полагается rm
использование getopts для парсинга его опций. Существуют приложения там, которые делают их собственный парсинг и будут рвать на том также (потому что они не могли бы обязательно реализовать"--
конец средств опций" логика).
Из-за этого решение, необходимо проехать череп, является этим:
rm ./--somefile
Это будет всегда работать, потому что этот путь Ваши аргументы никогда не начинается с a -
.
Кроме того, при попытке сделать действительно достойные сценарии оболочки; необходимо технически помещать ./
перед всеми Вашими расширениями параметра имени файла, чтобы препятствовать тому, чтобы Ваши сценарии повредились из-за броского входа имени файла (или предотвратить их быть оскорбил/использовал, чтобы сделать вещи, которые они, как предполагается, не делают: например, rm
удалит файлы, но перескочит через каталоги; в то время как rm -rf *
удалит все. Передача имени файла"-rf
"к сценарию или кому-то touch ~victim/-rf
'луг мог таким образом использоваться для изменения его поведения с действительно плохими последствиями).
Также rm -- --testings.html
или rm ./--testings.html
.
Еще один способ сделать это состоит в том, чтобы использовать, находят... - имя "-*" - удаляет
touch -- --file
find -x . -mindepth 1 -maxdepth 1 -name "--*" -delete
rm ./--testings.html
или
rm -- --testings.html
Для более универсального подхода к удалению файлов с невозможными символами в имени файла одним из вариантов является использование inode файла.
Его можно получить с помощью ls -i
.
например
$ ls -lai | grep -i test
452998712 -rw-r--r-- 1 dim dim 6 2009-05-22 21:50 --testings.html
И стереть его с помощью find:
$ find ./ -inum 452998712 -exec rm \{\} \;
Этот процесс может быть полезен при работе с большим количеством файлов с особенностями имени файла , так как это может быть легко написано скриптом.