Хорошо и
наглядно работает на константах
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 — лучше там плагины в сравнении с НетБинс, или тоже так себе?
Здравствуйте, 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>>
Сейчас играет Оргия Праведников — Ничего нет прекраснее смерти!
Здравствуйте, 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"
}
A>>Т.е. те же if-ы, вид сбоку. Понятно, почему нельзя написать case Item(expectedX, expectedY)
Z>Можно еще так:
Если уж не удосужился прочитать мой пост, так хотя бы потестируй свой код (например, при А=1)
Здравствуйте, avpavlov, Вы писали:
A>>>Т.е. те же if-ы, вид сбоку. Понятно, почему нельзя написать case Item(expectedX, expectedY)
Z>>Можно еще так:
A>Если уж не удосужился прочитать мой пост, так хотя бы потестируй свой код (например, при А=1)
Отчего же, у меня этот вариант тоже работает. Насколько я понял, штука в использовании идентификатора, начинающегося с большой буквы. Хотя, если честно, предпочёл бы свой вариант, так как он нагляднее ИМО
<< RSDN@Home 1.2.0 alpha 4 rev. 1128>>
Сейчас играет Оргия праведников — Стикс
Здравствуйте, Gajdalager, Вы писали:
G>Здравствуйте, avpavlov, Вы писали:
A>>>>Т.е. те же if-ы, вид сбоку. Понятно, почему нельзя написать case Item(expectedX, expectedY)
Z>>>Можно еще так:
A>>Если уж не удосужился прочитать мой пост, так хотя бы потестируй свой код (например, при А=1)
G>Отчего же, у меня этот вариант тоже работает. Насколько я понял, штука в использовании идентификатора, начинающегося с большой буквы. Хотя, если честно, предпочёл бы свой вариант, так как он нагляднее ИМО
Оп-па, прошу прощения! Я просто и про такую тонкость не знал.
Твой способ действительно слегка лучше, потому что мало ли кто вроде меня решит что переменная с большой буквы это не комильфо