Eşittir işareti ne zaman Scala yöntemi bildiriminde kullanılır?


85

Eşittir işaretiyle:

object HelloWorld {
  def main(args: Array[String]) = {
    println("Hello!")
  }
}

Eşittir işareti olmadan:

object HelloWorld {
  def main(args: Array[String]) {
    println("Hello!")
  }
}

Yukarıdaki programların her ikisi de aynı şekilde çalışır. Blog gönderisinde Scala'da beğenmediğim şeyler eşittir işareti eksik olduğunda yöntemin geri döneceğini Unit(Java'nınki ile aynı void) okudum , bu nedenle bir değer döndüren yöntemlerin eşittir işaretini kullanması gerekir. Ancak değer döndürmeyen yöntemler her iki şekilde de yazılabilir.

Değer döndürmeyen Scala yöntemlerinde eşittir işaretini kullanmak için en iyi uygulama nedir?

Yanıtlar:


109

Aslında Daniel'e kesinlikle katılmıyorum. Eşit olmayan sözdiziminin asla kullanılmaması gerektiğini düşünüyorum . Yönteminiz bir API olarak gösteriliyorsa ve yanlışlıkla yanlış türü döndürmekten endişeleniyorsanız, açık bir tür ek açıklaması ekleyin:

object HelloWorld {
  def main(args: Array[String]): Unit = {
    println("Hello!")
    123
  }
}

Eşit olmayan sözdizimi daha kısadır ve "daha temiz" görünebilir, ancak bence bu sadece karışıklık olasılığını ekliyor. Bazen eşittir işareti eklemeyi unuttum ve aslında Birim döndürürken yöntemimin bir değer döndürdüğüne inandım. Eşit olmayan ve eşit türden çıkarsanan sözdizimleri görsel olarak çok benzer olduğundan, bu sorunu gözden kaçırmak kolaydır.

Bana biraz daha pahalıya mal olsa da, önemli olduklarında açık tür ek açıklamalarını tercih ederim (yani, açık arayüzler).


1
Bu yaklaşımı seviyorum, daha açık ve dolayısıyla okuyucu için daha açık.
Lukasz Korzybski

4
Görünüşe göre bu artık önerilen stil ( docs.scala-lang.org/style/declarations.html#procedure_syntax ), bu yüzden bunu kabul edilen yanıt olarak değiştiriyorum.
Esko Luontola

1
Buna da katılıyorum, = olmadan sözdiziminin dilden tamamen kaldırılması gerektiğini düşünüyorum
Ahmed Soliman Farghal

7
Martin Odersky, "Scala with Style" açılış konuşmasında bunun tarihsel bir hata olduğunu söyledi. Bu sözdizimini (= olmadan) eklemesi gerekiyordu, böylece "Birimi" Java geliştiricilerinden gizleyebilir, böylece kafaları karışmaz. Ayrıca gelecekte kaldırılacağından da bahsetti.
tabdulradi

2
Yöntem tanımında eşittir işaretinin unutulması durumunda UYARI yapmanın bir yolu var mı? Örneğin bir derleyici seçeneği olarak veya herhangi bir kaynak analiz aracında mı?
VasiliNovikov

42

GÜNCELLEME: Scala-2.10 itibariyle eşittir işaretinin kullanılması tercih edilmektedir. Eski cevap:

Hangi dönüş Yöntemleri Unitgerektiğini hep sözdizimi-olmayan eşittir kullanın. Bu, API'ye taşınan uygulamadaki olası hataları önler. Örneğin, yanlışlıkla şöyle bir şey yapmış olabilirsiniz:

object HelloWorld {
  def main(args: Array[String]) = {
    println("Hello!")
    123
  }
}

Elbette önemsiz bir örnek, ancak bunun nasıl bir sorun olabileceğini görebilirsiniz. Geçen ifadesi Çünkü değil dönmek Unit, yöntem kendisi dışında bir dönüş türü olacak Unit. Bu, genel API'de ortaya çıkar ve ileride başka sorunlara neden olabilir. Eşit olmayan sözdizimiyle, son ifadenin ne olduğu önemli değildir, Scala dönüş türünü olarak sabitler Unit.

Aynı zamanda iki karakter daha temiz. :-) Ayrıca eşit olmayan sözdiziminin kodu okumayı biraz daha kolaylaştırdığını düşünüyorum. Söz konusu yöntemin bir Unitmiktar yararlı değerden ziyade geri döndüğü daha açıktır .

İlgili bir notta, soyut yöntemler için benzer bir sözdizimi vardır:

trait Foo {
  def bar(s: String)
}

Yöntemin barimzası var String=>Unit. Scala, bir soyut üyede tür ek açıklamasını atladığınızda bunu yapar. Bir kez daha, bu daha temiz ve (bence) okunması daha kolay.


3
Eşittir işaretini kullanmamak, Scala Stil Kılavuzunda da tavsiye edilir: davetron5000.github.com/scala-style/types/inference/…
Esko Luontola

6
O kısmı ben yazdım, bu yüzden referansı tartarken muhtemelen bunu aklınızda tutmalısınız. :-)
Daniel Spiewak

LoL, bu yüzden bu küçük alışverişi kız arkadaşıma anlattım, kötü sözlerimin "bit" inin "kaltak" olarak çıkması dışında. Söylemeye gerek yok, komedi ortaya çıktı.
Saem

10
ScalaDays 2013, Martin Odersky, Keynote - Scala with Style bölüm 45 : prosedür bildiriminden (eşit olmayan sözdizimi) kaçınılmalıdır.
senia

4
Resmi stil kılavuzu artık bunu önermiyor: docs.scala-lang.org/style/declarations.html#procedure_syntax
sbilstein

12

Sen gerekir Birimi dönen tanımlamalar dışındaki çağrı beyanlarında eşittir işaretini kullanın.

Bu sonuncu durumda, olabilecek eşittir işareti bırakmak. Yine de bu sözdizimi kullanımdan kaldırılmış olabilir, bu nedenle kaçınılması en iyisidir. Eşittir işaretini kullanmak ve dönüş türünü bildirmek her zaman işe yarar.


Kitaplar, posta listesi, kaynak kodu. Bu arada, o zamandan beri, ikinci sözdiziminin kullanımdan kaldırılma olasılığının düşük olduğu ve birçokları tarafından tercih edildiği anlaşıldı.
Daniel C. Sobral

1
docs.scala-lang.org/style/types.html#function_values ​​Türler kılavuzunun her zaman = kullanmayı belirttiği gibi görünüyor.
BeepDog

4

Yöntemler için Scala Stil Kılavuzu , prosedür sözdiziminin aksine eşittir sözdizimini önerir

Prosedür Sözdizimi

Kısalıkta çok az kazanç sağlamak için kafa karıştırıcı olma eğiliminde olduğundan prosedür sözdiziminden kaçının.

// don't do this
def printBar(bar: Baz) {
  println(bar)
}
// write this instead
def printBar(bar: Bar): Unit = {
  println(bar)
}

0

Bir şey: Unit döndürmesi gereken bir yöntemin son ifadesinin Unit döndürmediğini hayal edin. Eşit olmayan sözdizimini kullanmak o zaman çok uygundur, umarım bunun için birkaç kullanım durumu gördüğüm için bu kullanımdan kaldırılmaz


0

Zaman ilerledikçe varsayılan stil değişti ve yanıtlara yapılan yorumların çoğunda bundan bahsedildi, resmi stil kılavuzunda= işlev bildirimleri için sözdiziminin kullanılması tavsiye edilir .


1
Sağladığınız bağlantı sadece işlevlerden bahsediyor, prosedürlerden değil (yani Birim döndüren işlevler).
Esko Luontola

Haklısın @EskoLuontola, Bunun için üzgünüm, muhtemelen açtığım birçok sekmeden birinden yanlış bağlantıyı kopyaladım, güncellendi.
BeepDog

0

dönüş değeri olmayan yöntem için, bu tür yöntemleri ifade etmenin bir yolu, küme ayraçları içine alınmış bir blokla yöntemi izleyerek sonuç türünü ve eşittir işaretini dışarıda bırakmaktır. Bu formda, yöntem bir prosedüre benziyor, yalnızca yan etkileri için yürütülen bir yöntem.

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.