[Scala] Убогий паттерн матчинг или я чего-то упускаю
От: avpavlov  
Дата: 10.02.09 14:15
Оценка:
Хорошо и наглядно работает на константах

case class Item(x:int, y:int)

val item = Item(...)
item match {
 case Item(0,0) => "zeroes"
 case ...
}


но если мне требуется сопоставить объект с образцом, характеристики которого заранее неизвестны, то получается вот такая фигня

case class Item(x:int, y:int)

val expectedX = 0;
val expectedY = 0;
val item = Item(...)
item match {
 case Item(a,b) if (a==expectedX && b==expectedY) => "zeroes"
 case ...
}


Т.е. те же if-ы, вид сбоку. Понятно, почему нельзя написать case Item(expectedX, expectedY), потому что в данном случае получаем синонимы для значений объекта, но почему нельзя написать что-то вроде case Item(@expectedX, @expectedY) — т.е. каким либо образов указать компилятору, что я хочу использовать здесь значения переменных.

Или такое возможно, а я просто плохо читал? Если нельзя, то паттерн матчинг получается довольно убогий, потому что не позволяет избавиться от if-ов, которые неудобно читать.

ПС

Плагин для НетБинс довольно неудобный. Кто-нибудь имел опыт с Eclipse и IDEA — лучше там плагины в сравнении с НетБинс, или тоже так себе?
Re: [Scala] Убогий паттерн матчинг или я чего-то упускаю
От: Gajdalager Украина  
Дата: 10.02.09 14:42
Оценка: 16 (2)
Здравствуйте, avpavlov, Вы писали:


A>Т.е. те же if-ы, вид сбоку. Понятно, почему нельзя написать case Item(expectedX, expectedY), потому что в данном случае получаем синонимы для значений объекта, но почему нельзя написать что-то вроде case Item(@expectedX, @expectedY) — т.е. каким либо образов указать компилятору, что я хочу использовать здесь значения переменных.


Попробуй так:
[code]
case Item(`expX`, `expY`) => "zeroes"
[code]
Заключением в обратные кавычки так же можно вызвать метод Джавишного класса, имя которого совпадает с ключевым словом Скалы:
[code]
object.`with`(1)
[code]
<< RSDN@Home 1.2.0 alpha 4 rev. 1128>>
Сейчас играет Оргия Праведников — Ничего нет прекраснее смерти!
Re[2]: [Scala] Убогий паттерн матчинг или я чего-то упускаю
От: avpavlov  
Дата: 10.02.09 14:50
Оценка:
G>[code]
G>case Item(`expX`, `expY`) => "zeroes"
G>[code]

Ит воркс!
Re: [Scala] Убогий паттерн матчинг или я чего-то упускаю
От: z00n  
Дата: 10.02.09 23:00
Оценка: 20 (2) +1
Здравствуйте, avpavlov, Вы писали:

A>но если мне требуется сопоставить объект с образцом, характеристики которого заранее неизвестны, то получается вот такая фигня


A>
A>case class Item(x:int, y:int)

A>val expectedX = 0;
A>val expectedY = 0;
A>val item = Item(...)
A>item match {
A> case Item(a,b) if (a==expectedX && b==expectedY) => "zeroes"
A> case ...
A>}
A>


A>Т.е. те же if-ы, вид сбоку. Понятно, почему нельзя написать case Item(expectedX, expectedY)

Можно еще так:
  val A = 0
  val B = 0
  
  def test(i:Item):String =  i match {
    case Item(A,B) => "zeros"
    case _ => "bad"
  }
Re[2]: [Scala] Убогий паттерн матчинг или я чего-то упускаю
От: avpavlov  
Дата: 11.02.09 07:55
Оценка:
A>>Т.е. те же if-ы, вид сбоку. Понятно, почему нельзя написать case Item(expectedX, expectedY)
Z>Можно еще так:

Если уж не удосужился прочитать мой пост, так хотя бы потестируй свой код (например, при А=1)
Re[3]: [Scala] Убогий паттерн матчинг или я чего-то упускаю
От: Gajdalager Украина  
Дата: 11.02.09 08:17
Оценка:
Здравствуйте, avpavlov, Вы писали:


A>>>Т.е. те же if-ы, вид сбоку. Понятно, почему нельзя написать case Item(expectedX, expectedY)

Z>>Можно еще так:

A>Если уж не удосужился прочитать мой пост, так хотя бы потестируй свой код (например, при А=1)


Отчего же, у меня этот вариант тоже работает. Насколько я понял, штука в использовании идентификатора, начинающегося с большой буквы. Хотя, если честно, предпочёл бы свой вариант, так как он нагляднее ИМО
<< RSDN@Home 1.2.0 alpha 4 rev. 1128>>
Сейчас играет Оргия праведников — Стикс
Re[4]: [Scala] Убогий паттерн матчинг или я чего-то упускаю
От: avpavlov  
Дата: 11.02.09 08:33
Оценка:
Здравствуйте, Gajdalager, Вы писали:

G>Здравствуйте, avpavlov, Вы писали:



A>>>>Т.е. те же if-ы, вид сбоку. Понятно, почему нельзя написать case Item(expectedX, expectedY)

Z>>>Можно еще так:

A>>Если уж не удосужился прочитать мой пост, так хотя бы потестируй свой код (например, при А=1)


G>Отчего же, у меня этот вариант тоже работает. Насколько я понял, штука в использовании идентификатора, начинающегося с большой буквы. Хотя, если честно, предпочёл бы свой вариант, так как он нагляднее ИМО


Оп-па, прошу прощения! Я просто и про такую тонкость не знал.

Твой способ действительно слегка лучше, потому что мало ли кто вроде меня решит что переменная с большой буквы это не комильфо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.