Как выполнить сопоставление с образцом с vararg классами случая?

У меня есть ряд классов случая как это

abstract class Shape  
case class Rectangle(width: Int, height: Int) extends Shape  
case class Location(x: Int, y: Int, shape: Shape) extends Shape  
case class Circle(radius: Int) extends Shape  
case class Group(shape: Shape*) extends Shape

где в основном Группа является массивом форм. Я должен определить метод размера для вычислительных размеров для прямоугольника, круга и местоположения, его простые просто возвращают тот. Но я испытываю затруднения для Группы.

object size extends Shape{  
  def size(s: Any) : Int = s match {  
    case Rectangle(x,y) => 1  
    case Group  // how to do it? Also having case Group(shape : Shape*) gives an error  
    case Circle(r) => 1    
    case Location(x,y,shape) => 1   
  }  
}  

Я знаю для Группы, я должен использовать карту и оставленный сгиб, но я действительно наклон создаю логику для него.Спасибо

13
задан Alan Moore 27 February 2010 в 00:17
поделиться

5 ответов

Если мое понимание служит мне правильно, полномочия аутентификации пользователей хранятся в контексте HTTP каждого приложения. Таким образом, переключение между двумя приложениями не будет автоматически аутентифицировать пользователя, так как новый контекст будет создан при переключении в приложение B.

Я полагаю, что правильным подходом будет использование DefureCredentials (или Свойство UseDefureCredentials с значением True ) текущего пользователя перед переключением в приложение B.

Если вы говорите «переключить», что вы имеете в виду, например. открыть другое окно браузера и получить доступ к приложению B или запросить страницу из приложения B из приложения A?

-121--2158583-

Можно также исследовать классы BineyReader/BinureWriter, которые могут быть обернуты вокруг любого потока, TCP или другого.

Эти функции поддерживают, помимо прочих функций, последовательностей чтения/записи (в кодировке по вашему выбору) при одновременном включении длины последовательности.

-121--3950506-

Первый шаг - выяснить, что вы имеете в виду. Двумя наиболее очевидными выбор являются общая площадь, охватываемая всеми формами, и минимальный прямоугольник, содержащий их все. Если для кругов вы возвращаете фактическую область, они, вероятно, должны идти с фактической области.

Нет закрытого способа ответить на это. Я мог бы подумать о том, чтобы бросить тысячу случайных дротиков на минимум окружающий прямоугольник и оценить площадь как процент дротиков, которые попали в занятую точку. Является ли оценка приемлемым ответом?

Гарантируете ли вы, что все формы будут окружностями и прямоугольниками? Возможно, вы сможете собрать вместе решение, которое сработает для них. Если Фигуры могут быть расширены дальше, то это не сработает.

2
ответ дан 1 December 2019 в 20:57
поделиться

case g: Group => g.shape.map (size (_)). Sum

case Group (ss @ *) => ss.map (size ()). Sum

оба из них дают сумму значения ошибки не является членом Seq [Int]
Однако эта oen работает
case Group (shape @ _ *) => (0 /: shape) {_ + size (_)

0
ответ дан 1 December 2019 в 20:57
поделиться

Любой из них будет работать, второй, вероятно, предпочтительнее, если он немного странный на первый взгляд. См. Раздел 8.1.9 «Последовательности шаблонов» в Справочнике по Scala .

case g: Group => g.shape.map(size(_)).sum

case Group(ss @ _*) => ss.map(size(_)).sum

Здесь используется Scala 2.8. sum может не работать в более старых версиях.

17
ответ дан 1 December 2019 в 20:57
поделиться

Синтаксис для сопоставления шаблонов vararg несколько странный.

def size(s: Shape) : Int = s match{
  case Rectangle(x,y) => 1
  case Circle(r) => 1
  case Location(x,y,shape) => 1
  case Group(shapes @ _*) => (0 /: shapes) { _ + size(_) }
}

Обратите внимание, что в последней строке вы суммируете размеры всех под-форм, начиная с нуля, используя /:-нотацию для складок.


Как работают складки: Складки накапливают элементы последовательности, используя заданную функцию.

Так, чтобы вычислить сумму списка, мы бы написали (в стиле Хаскелла)

fold (\total element -> total + element) 0 list

что объединит все элементы списка с заданной функцией сложения, начиная с 0 (и, следовательно, вычислит сумму).

В Scala мы можем написать это так:

(0 /: list) { (total, element) => total + element }

что можно упростить до

(0 /: list) { _ + _ }
8
ответ дан 1 December 2019 в 20:57
поделиться

Для Location размер должен быть детализирован, чтобы получить размер, поскольку форма может быть группой, что приводит к большему количеству

case Location (x, y, shape) => size (shape)

То есть, если размер - это число форм в форме

1
ответ дан 1 December 2019 в 20:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: