Как мне справиться с получением [object] или None в Scala?

Я реализую таблицу Users в Slick с классом User, который расширяет свойство SecureSocial Identity. У меня возникли проблемы с преобразованием из необязательного объекта типа, не сохраняемого в базе данных, в необязательный примитивный тип базы данных.

Чтобы обратиться к: Slick docs, Документы по SecureSocial (чтобы сгенерировать документацию по API для SecureSocial, извлеките из их Github, перейдите в их каталог "module-code" и запустите play doc. Затем посмотрите в module-code/target/ api и откройте index.html)

Что я имею

Возьмите этот параметр в классе case User:

oAuth1Info: Option[securesocial.core.OAuth1Info]

Где новый конструктор экземпляра OAuth1Info в Scaladoc выглядит так:

new OAuth1Info(token: String, secret: String)

Теперь в моем методе * (как описано здесь):

def * = stuffs ~ oAuth1InfoToken ~ oAuth1InfoToken ~ moreStuff <> 
    ( // the following is the apply method
    { t => User(stuffs, 
        Some(OAuth1Info( (t._9).getOrElse(""), (t._10).getOrElse("")) ), 
        moreStuffs)
    }, // the following is the unapply method
    {
        (r: User) => Some( (r.stuffs, 
            (r.oAuth1Info).getOrElse(None).token , // ERROR
            (r.oAuth1Info).getOrElse(None).secret , // ERROR
            r.moreStuffs) )
    }

Что я пытаюсь сделать

Вставьте None в базу данных, если oAuth1Info не было указано, и

Option[securesocial.core.OAuth1Info] = None

В противном случае возьмите объект OAuth1Info, получите токен и секрет и сохраните их в соответствующих столбцах моей базы данных.

В дополнение к этой отображенной проекции, представляющей собой строку из 500+ символов, мне нужно сделать что-то вроде

oAuth1Info match {
    case None: None
    case _: oAuth1Info.token
}

? Возможно ли однострочное сопоставление с образцом? Я так потерялся в своем коде в этот момент...

Спасибо за любую помощь


Если вы хотите увидеть мою полную реализацию до сих пор...

Scala + Slick + SecureSocial = печально длинный код

Я знаю, что этот код — стена текста. Многострочный код Scala был бы здесь потрясающим, если бы он существовал? Pastebin


person Meredith    schedule 01.07.2013    source источник


Ответы (2)


Я не совсем понял типы в вашем исходном вопросе, но метод oAuth1Unapply в вашем ответе можно переписать как

def oAuth1Unapply(smth: Option[securesocial.core.OAuth1Info]): (String, String) =
  smth.map(oa => (oa.token, oa.secret)).getOrElse(("",""))

Метод map применяет функцию к содержимому Option, если оно не равно None, и возвращает результат как значение Some, иначе оставляет результат как None.

person Kristian Domagala    schedule 01.07.2013

Я глупый. Я понял.

Поэтому я использую сопоставление с образцом.

def oAuth1Unapply(smth: Option[securesocial.core.OAuth1Info]): (String, String) =  {
    smth match {
          case None => ("", "")
          case _ => (smth.getOrElse(OAuth1Info("","")).token, smth.getOrElse(OAuth1Info("","")).secret)
        }
}

Тогда я делаю

val oa1 = oAuth1Unapply(r.oAuth1Info)
def * = stuffs ~ oAuth1InfoToken ~ oAuth1InfoToken ~ moreStuff <> 
( // the following is the apply method
{ t => User(stuffs, 
    Some(OAuth1Info( (t._9).getOrElse(""), (t._10).getOrElse("")) ), 
    moreStuffs)
}, // the following is the unapply method
{
    (r: User) => Some( (r.stuffs, 
        oa1._1, oa2._2
        r.moreStuffs) )
}
person Meredith    schedule 01.07.2013
comment
def * не компилируется таким образом, если и stuff, и moreStuff являются проекциями. Вы должны использовать ~: после материалов. - person cvogt; 01.07.2013
comment
? Что вы имеете в виду под не компилируется таким образом? Какой способ? - person Meredith; 01.07.2013
comment
Я следил за документацией Slick. , и это то, что они делают... кажется, у меня пока все нормально компилируется - person Meredith; 01.07.2013
comment
Всегда возвращать Some для OAuth1Info (иногда с пустыми строковыми полями) выглядит подозрительно. Зачем тогда вообще вариант? Возможно, вам нужно это: t._9.map( OAuth1Info( t._9.get, t._10.get )). Имейте в виду, что это предполагает, что если _9 не равно None, то _10 также не равно None. Вы должны адаптировать код, если это предположение не выполняется. - person cvogt; 01.07.2013
comment
Выглядит ли def * в вашем коде точно так же, как def * = stuffs ~ oAuth1InfoToken ~ oAuth1InfoToken ~ moreStuff, где stuff и moreStuff имеют тип Projection (не Column[...])? - person cvogt; 01.07.2013
comment
Почти да, но с гораздо большим количеством полей... вот идея одного из моих кодов - person Meredith; 01.07.2013
comment
точно. с def stuff = col1 ~ col2; def moreStuff = col4 ~ col5 это работает: def * = stuff ~ col3 ~ col4 ~ col5 но это не def * = stuff ~ col3 ~ moreStuff (ошибка компиляции). Кстати, мое предыдущее предложение использовать ~: было неверным. вы не можете объединить две предыдущие проекции (оператор ~) в новую в Slick 1.x. В Slick 2.0 это должно быть возможно. - person cvogt; 01.07.2013