Scala'da desen eşleştirme neden değişkenlerle çalışmıyor?


113

Aşağıdaki işlevi alın:

def fMatch(s: String) = {
    s match {
        case "a" => println("It was a")
        case _ => println("It was something else")
    }
}

Bu model güzel bir şekilde eşleşiyor:

scala> fMatch("a")
It was a

scala> fMatch("b")
It was something else

Yapmak istediğim şey şu:

def mMatch(s: String) = {
    val target: String = "a"
    s match {
        case target => println("It was" + target)
        case _ => println("It was something else")
        }
}

Bu, aşağıdaki hatayı verir:

fMatch: (s: String)Unit
<console>:12: error: unreachable code
               case _ => println("It was something else")

Sanırım bunun nedeni, hedefin aslında girdi ne olursa olsun atamak istediğiniz bir isim olduğunu düşünmesidir. İki soru:

  1. Neden bu davranış? Durum sadece kapsamda uygun türe sahip mevcut değişkenleri arayamaz ve önce bunları kullanamaz ve eğer hiçbiri bulunamazsa hedefi şablon eşleştirmesi için bir ad olarak ele alamaz mı?

  2. Bunun için bir çözüm var mı? Değişkenlerle eşleştirmenin herhangi bir yolu var mı? Nihayetinde biri büyük if ifadesi kullanabilirdi, ancak eşleştirme durumu daha zariftir.



1
Bu soru, kod ve cevapların Scala 2.12.x itibariyle modası geçmiş olduğuna inanıyorum. Uygulanacak versiyonun sorunun bir parçası olarak belirtilmesi güzel olurdu.
conny

Yanıtlar:


217

Aradığınız şey kararlı bir tanımlayıcıdır . Scala'da bunlar ya büyük harfle başlamalı ya da ters işaretlerle çevrelenmelidir.

Bunların ikisi de sorununuzun çözümü olabilir:

def mMatch(s: String) = {
    val target: String = "a"
    s match {
        case `target` => println("It was" + target)
        case _ => println("It was something else")
    }
}

def mMatch2(s: String) = {
    val Target: String = "a"
    s match {
        case Target => println("It was" + Target)
        case _ => println("It was something else")
    }
}

Kapalı kapsamda zaten var olan değişkenlere yanlışlıkla atıfta bulunmaktan kaçınmak için, küçük harfli desenlerin sabit tanımlayıcılar değil değişkenler olması için varsayılan davranışın mantıklı olduğunu düşünüyorum. Sadece büyük harfle başlayan veya arka tiklerle başlayan bir şey gördüğünüzde, çevreleyen kapsamdan geldiğinin farkında olmanız gerekir.


3
Bahse girerim bu, değişkenlerin büyük harfle ve sembollerin küçük harfle başladığı Erlang'dan geliyor.
Emil Ivanov

11
Bunun bir değişken ( ) değil target, bir değer ( val) olduğuna dikkat edin var. Değişkenlerle çalışmaz.
Luigi Plinge

Büyük harf? FORTRAN'ın tonları. Zayıf, Martin, zayıf.
Malvolio

13
@Emil Aslında, Scala'daki büyük harfli tanımlayıcılar sabitleri ifade eder. Dolayısıyla, büyük harfli bir tanımlayıcıdaki örüntü eşlemesi, bir sabitle karşılaştırma anlamında alınır. Cidden gibi şeylerle yardımcı olur Nil, ben bahis gerçek nedenidir.
Daniel C. Sobral

Görünüşe göre kişi thisona karşı model eşleştirmek için kararlı bir tanımlayıcı olarak kullanılamaz, tek yol gibi bir eşitlik koruması kullanmak gibi görünüyor case x if x == this =>. Muhtemelen sözdizimsel bir sınırlama, aksi takdirde anlamsal olarak en azından objects içinde çalışmalıdır .
Nader Ghanbari
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.