Scala: краткий способ выразить следующую конструкцию - PullRequest
4 голосов
/ 22 июля 2010

Я приведу псевдокод в скобках в стиле C, чтобы показать, что я хотел бы выразить другим способом:

for (int i = 0; i < n; i++) {
    if (i == 3 || i == 5 || i == 982) {
        assertTrue( isCromulent(i) );      
    } else {
        assertFalse( isCromulent(i) );
    }
}

Цикл для не очень важен, это не главное в моем вопросе: я хотел бы знать, как я могу переписать то, что внутри цикла, используя Scala.

Моя цель не в том, чтобы получить самый короткий код: это потому, что я хотел бы понять, какие манипуляции можно выполнять с именами методов (?) В Scala.

Можете ли вы сделать что-то вроде следующего в Scala (ниже по-прежнему какой-то псевдокод, а не код Scala):

assert((i==3 || i==5 || i==982)?True:False)(isCromulent(i))

Или даже как-то так:

assertTrue( ((i==3 || i==5 || i==982) ?  : ! ) isCromulent(i) )

В основном, я хотел бы знать, можно ли использовать результат теста (i == 3 || i == 5 || i == 982) для отправки между двумя методами или для добавьте "not" перед выражением.

Я не знаю, имеет ли это смысл, поэтому, пожалуйста, будьте добры (посмотрите мой профиль):)

Ответы [ 4 ]

10 голосов
/ 22 июля 2010

Хотя решение pelotom для этого случая гораздо лучше, вы также можете сделать это (что немного ближе к тому, что вы изначально просили):

(if (i==3||i==5||i==982) assertTrue else assertFalse)(isCromulent(i))

Динамическое построение имен можно выполнить с помощью отражения, ноэто конечно не будет кратким.

8 голосов
/ 22 июля 2010
assertTrue(isCromulent(i) == (i==3||i==5||i==982))
6 голосов
/ 22 июля 2010

В системе типов Scala невозможно динамически создать имя метода на основе условия.

Но в этом случае это совсем не обязательно.

val condition = i == 3 || i == 5 || i == 982
assertEquals(condition, isCromulent(i))
2 голосов
/ 22 июля 2010

Я надеюсь, что никто не возражает против этого ответа, который является скорее сторонним, чем прямым ответом.

Я нашел вопрос и ответы до сих пор очень интересным и провел некоторое время в поисках альтернативы, основанной на сопоставлении с образцом.

Ниже приводится попытка обобщить эту (очень специфическую) категорию тестирования:

class MatchSet(s: Set[Int]) {def unapply(i: Int) = s.contains(i)}
object MatchSet {def apply(s: Int*) = new MatchSet(Set(s:_*))}


val cromulentSet = MatchSet(3, 5, 982)

0 until n foreach {
  case i @ cromulentSet() => assertTrue(isCromulent(i))
  case i                  => assertFalse(isCromulent(i))
}

Идея состоит в том, чтобы создавать диапазоны значений, содержащихся в экземплярах MatchSet, а не использовать явные совпадения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...