Scala infix gösterimi


12

Infix gösterimini kullanarak bir yöntem çağırmak mümkün mü?

Örneğin, Haskell'de aşağıdaki işlevi yazabilirim:

x `isAFactorOf` y = x % y == 0

ve sonra şöyle kullanın:

if 2 `isAFactorOf` 10 ...

Hangi bazı durumlarda çok okunabilir kod sağlar. Scala'da buna benzer bir şey mümkün mü? "Scala infix notasyonu" nu aradım, ancak bu terim Scala'da farklı bir şey ifade ediyor gibi görünüyor.

Yanıtlar:


15

Sürüm 2.10'dan başlayarak Scala, bu sorunu tam olarak ele almak için örtülü Sınıflar tanıttı.

Bu, belirli bir türde, kendi yöntemlerinizi ve değerlerinizi içerebilecek bir sarılmış sınıfa örtük bir dönüştürme gerçekleştirecektir.

Özel durumunuzda şöyle bir şey kullanırsınız:

implicit class RichInt(x: Int) {
  def isAFactorOf(y: Int) = x % y == 0
}

2.isAFactorOf(10)
// or, without dot-syntax
2 isAFactorOf 10

Derlendiğinde, bunun ham değerimizi a RichInt(2). RichInt'inizi bir alt sınıf olarak ilan ederek bu sorunu çözebilirsiniz AnyVal:

implicit class RichInt(val x: Int) extends AnyVal { ... }

Bu boks yapmaya neden olmaz, ancak tipik bir örtük sınıftan daha kısıtlayıcıdır. Değerler veya durum değil , yalnızca yöntemler içerebilir.


2
Büyük olasılıkla örtük sınıfların üst düzey olamayacağını belirtmelisiniz, bu nedenle örtük sınıfın yerel olarak tanımlanması gerekecektir.
Aralık'ta Carcigenicate

3

Esasen, Scala'da bir fonksiyonu sabit bir şekilde çağıramazsınız, ancak sol argümanın örtük olarak dönüştürülebileceği bir tipte bir yöntem tanımlayabilirsiniz. Örneğiniz için, bir yöntemi olan bir sınıfı tanımlayabilirsinizAFactorOf (bir Int alarak) ve bir Int'nin dolaylı olarak bu sınıfın bir örneğine dönüştürülebileceğini belirtebilirsiniz.

Bu cevaba https://stackoverflow.com/a/3119671 başka bir soruya bakarsanız, Scala'da aynı şekilde çalışan sözdizimini göreceksiniz.


Cevap bağlantılı Scala yeni sürümü bunun için açıkça bir yapı olduğunu işaret It değerinde, adres yok: implicit class RichInt(i: Int) { def square() = i * i }.
KChaloux
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.