сопоставление шаблонов в scala работает внутри def, в противном случае

Умная галерея Android с несколькими действиями по выбору изображения.

Проверьте демонстрацию в моем блоге

Сначала сделайте кнопку для действия, и вы можете использовать ее для single / multiple

Для выбора одиночного изображения : - - luminous.ACTION_PICK для выбора одного изображения.

Для выбора нескольких изображений : - - luminous.ACTION_MULTIPLE_PICK для выбора нескольких изображений.

MainActivity.java

// For single image
Intent i = new Intent(Action.ACTION_PICK);
startActivityForResult(i, 100);

// For multiple images
Intent i = new Intent(Action.ACTION_MULTIPLE_PICK);
startActivityForResult(i, 200);

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == 100 && resultCode == Activity.RESULT_OK) {
            adapter.clear();

            viewSwitcher.setDisplayedChild(1);
            String single_path = data.getStringExtra("single_path");
            imageLoader.displayImage("file://" + single_path, imgSinglePick);

        } else if (requestCode == 200 && resultCode == Activity.RESULT_OK) {
            String[] all_path = data.getStringArrayExtra("all_path");

            ArrayList dataT = new ArrayList();

            for (String string : all_path) {
                CustomGallery item = new CustomGallery();
                item.sdcardPath = string;

                dataT.add(item);
            }

            viewSwitcher.setDisplayedChild(0);
            adapter.addAll(dataT);
        }
    }

В AndroidManifest.xml


            
                
                

                
            
 

0
задан Subhrajit Bhattacharya 13 July 2018 в 06:12
поделиться

2 ответа

Причина такого поведения соответствия scala-шаблонов лежит в системе типов. Scala имеет очень прочную систему типов, которая обеспечивает высокую степень безопасности и улавливает ошибки во время компиляции. Если вы объявляете функцию с параметром вместо Any, она также выдает ту же ошибку.

Для ex: -

def echoWhatYouGaveMe(x: (Int, Int)): String = x match {

  case (a, b) => s"got $a and $b"
  case (a, b, c) => s"got $a, $b, and $c"
  case _ => "Unknown"
}

echoWhatYouGaveMe((1,2))

Вы получаете сообщение об ошибке

Error:(4, 9) constructor cannot be instantiated to expected type;
 found   : (T1, T2, T3)
 required: (Int, Int)
  case (a, b, c) => s"got $a, $b, and $c"
       ^

Если вы изменяете свой val myTuple и явно устанавливаете его тип в Any, это позволит вам выполнить сопоставление с образцом.

val myTuple: Any = (1, 2, 3)

val toPrint = myTuple match {
  case (a, b, c) => s"got $a, $b, and $c"
  case (a, b) => s"got $a and $b"
  case _ => s"Unknown data"
}

Вы получаете такой же результат

myTuple: Any = (1,2,3)

toPrint: String = got 1, 2, and 3
8
ответ дан Chaitanya Waikar 17 August 2018 в 13:35
поделиться
  • 1
    @Subhrajit Bhattacharya надеюсь, что это ответит на ваш вопрос. – Chaitanya Waikar 13 July 2018 в 08:10

Когда вы пишете

val myTuple = (1, 2, 3)

, тип myTuple считается (Int, Int, Int). Поэтому, когда вы match, все шаблоны должны быть совместимы с этим типом, т. Е. Должны быть значения этого типа, которые бы соответствовали шаблону. В противном случае шаблон бесполезен и может быть удален. case (a, b) - такая бесполезная картина.

В фрагменте 1 шаблон не бесполезен, потому что является совместимым с Any.

0
ответ дан Alexey Romanov 17 August 2018 в 13:35
поделиться
Другие вопросы по тегам:

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