Как определить переменные путем удаления списка дополнительных частей? - PullRequest
0 голосов
/ 20 сентября 2019

Это работает нормально,

 val Array(a,b) = "Hello,Bye".split(',')

Но это ошибка, потому что дополнительная информация не игнорируется:

 val Array(a,b) = "Hello,Bye,etc".split(',')
 // scala.MatchError: ...

как игнорировать дополнительную информацию?


Та же ошибка в случае меньшего количества элементов:

 val Array(a,b) = "Hello".split(',')

ВАЖНО : нет такого элегантного способа, как Javascript Разрушающее назначение ?

Ответы [ 4 ]

3 голосов
/ 20 сентября 2019

Добавьте заполнитель, используя подчеркивание:

val Array(a,b, _) = "Hello,Bye,etc".split(',')

РЕДАКТИРОВАТЬ : использование синтаксиса match-case, как правило, является более предпочтительным и более гибким (и вы можете отследить все возможные результаты):

val s = "Hello,Bye,etc"

s.split(',') match {
  case Array(a) => //...
  case Array(a, b) => //...
  case Array(a, b, rest@_*) => //...
  case _ => //Catch all case to avoid MatchError
}
1 голос
/ 20 сентября 2019

Я хотел бы рассмотреть вопрос о том, чтобы сделать результирующие значения типа Option[String] с помощью lift, то есть разделить Array[String] (рассматриваемый как частичную функцию) в Int => Option[String] функцию:

val opts = "Hello".split(",").lift
// opts: Int => Option[String] = <function1>

opts(0)
// res1: Option[String] = Some(Hello)

opts(1)
// res2: Option[String] = None

Или, если предпочтительны значения String, а None переведено на "":

val strs = "Hello,world".split(",").lift.andThen(_.getOrElse(""))
// strs: Int => String = scala.Function1$$Lambda$...

strs(0)
// res3: String = Hello

strs(1)
// res4: String = "world"

strs(2)
// res5: String = ""

Обратите внимание, что при таком подходе вы можете взять столько opts(i) или strs(i), i = 0,1, 2, ..., как и хотел.

1 голос
/ 20 сентября 2019

@_ будет охватывать оба экземпляра.

val Array(a,b,x@_*) = "Hello,Bye,etc".split(',')
//a: String = Hello
//b: String = Bye
//x: Seq[String] = ArraySeq(etc)

val Array(c,d,z@_*) = "Hello,Bye".split(',')
//c: String = Hello
//d: String = Bye
//z: Seq[String] = ArraySeq()

Из ваших комментариев похоже, что вы хотите установить по умолчанию "", пустое String.Я нашел способ сделать это с Stream, который устарел в Scala 2.13, но пока это самое чистое решение, которое я нашел.

val Stream(a,b,c,d,_*) = "one,two,etc".split(",").toStream ++ Stream.continually("")
//a: String = one
//b: String = two
//c: String = etc
//d: String = ""
0 голосов
/ 20 сентября 2019

Вы можете сделать это, сначала преобразовав в Список:

val a :: b :: _ = "Hello,Bye,etc".split(',').toList
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...