Массив Scala без имени - PullRequest
       1

Массив Scala без имени

0 голосов
/ 15 ноября 2018

Вот как я могу проверить, является ли число четным / нечетным в Ruby:

def even_or_odd(number)
  ['Even', 'Odd'][number % 2]
end

Самое близкое, что у меня есть в Scala:

  def evenOrOdd(number: Int): String = {
     val a = Array("Even", "Odd")
     a(number % 2)
  }

Что я действительно хочу сделать, это что-то вроде этого, но оно не скомпилируется:

  def evenOrOdd(number: Int): String = {
    ("Even", "Odd")(number % 2)
  }

Во-первых, как называется этот тип «анонимной» структуры? Во-вторых, что такое элегантный способ его использования? Если у вас есть подобный пример, который иллюстрирует мощь / лаконичность / ясность Scala, я бы хотел это увидеть.

Ответы [ 3 ]

0 голосов
/ 15 ноября 2018

("Even", "Odd") относится к типу (String,String), который является псевдонимом для Tuple2[String, String], это методы доступа ._1 и ._2

вы можете сделать Array("Even", "Odd")(number % 2) или РЕДАКТИРОВАТЬ: как указано в комментариях, это на самом деле не будет работать. Это будет, хотя Array("Even", "Odd").apply(number % 2)

number % 2 match {
    case 0 => "Even"
    case 1 => "Odd"
    case -1 => "Odd" //EDIT: as per comment. I forgot about this case
}
0 голосов
/ 15 ноября 2018
def evenOrOdd(number: Int) = 
 List("Even","Odd")(number % 2)
0 голосов
/ 15 ноября 2018

Это компилируется:

def evenOrOdd(number: Int): String = {
    Array("Even", "Odd").apply(number % 2)
}

В большинстве случаев вызов метода apply может быть опущен, поскольку он поставляется с синтаксическим сахаром. Однако в этом случае это не работает. Вы должны либо извлечь Array("Even", "Odd") в var, var или def, либо отказаться от синтаксического сахара.

Причину, по которой синтаксический сахар Array("Even", "Odd")(number % 2) не работает, как-то сложно объяснить, но это вызвано следующим:

  • Java не позволяет создавать универсальный массив (например, new T[], где T - универсальный тип)
  • Scala позволяет создавать универсальный массив, используя ClassTag в Array.apply; ClassTag поставляется с собственным синтаксическим сахаром, который делает Array("Even", "Odd")(number % 2) недействительным
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...