Я изучаю scala. Это очень многообещающе, благодаря Одерскому и всем остальным авторам за их большую работу.
Я взял проблему эйлера (http://projecteuler.net/), чтобы иметь более-минимальный пример. И я пытаюсь идти по функциональному пути. Так что это не "пожалуйста, ответьте мне немедленно или мой босс убьет меня", но "пожалуйста, если у вас есть время, можете ли вы помочь императивному языковому программисту совершить путешествие в функциональном мире?"
Проблема: я хочу класс для рук в покере. Покерная рука состоит из нескольких карт, от 0 до 5. Я хотел бы создать список карт один и для всех, то есть: мой класс Руки будет неизменным, если я хочу добавить карту, то Я создаю новый объект Hand. Поэтому мне нужна коллекция Card, которую можно создать как "val", а не var. Первый шаг: конструкторы, по одному для каждого числа карт. Но сборка карт обрабатывается в каждом конструкторе, поэтому я должен иметь его как var!
Здесь код, класс карты - это просто Костюм и значение, переданные конструктору в виде строки ( "5S" - это 5 пиков):
class Hand(mycards : List[Card]) {
// this should be val, I guess
private var cards : List[Card] = {
if (mycards.length>5)
throw new IllegalArgumentException(
"Illegal number of cards: " + mycards.length);
sortCards(mycards)
}
// full hand constructor
def this(a : String, b : String, c : String, d : String, e : String) = {
this(Nil)
// assign cards
val cardBuffer = new ListBuffer[Card]()
if ( a!=null ) cardBuffer += new Card(a)
if ( b!=null ) cardBuffer += new Card(b)
if ( c!=null ) cardBuffer += new Card(c)
if ( d!=null ) cardBuffer += new Card(d)
if ( e!=null ) cardBuffer += new Card(e)
cards = sortCards(cardBuffer.toList)
}
// hand with less then 5 cards
def this(a : String, b : String, c : String, d : String) = this(a,b,c,d,null)
def this(a : String, b : String, c : String) = this(a, b, c, null)
def this(a : String, b : String) = this(a, b, null)
def this(a : String) = this(a, null)
def this() = this(Nil)
/* removed */
}
Вы знаете, как сделать его истинным функциональным способом? Спасибо.
PS: если вы действительно хотите знать, это проблема 54.