Я изучаю 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.
