Scala neden Java'da olduğu gibi '*' yerine paket içe aktarmak için '_' operatörünü kullanıyor?


17

Kanımca, Scala ile ilgili en büyük şeylerden biri, Java ile birlikte çalışabilirliği ve benzer sözdizimidir. Garip bulduğum bir şey, Java'da kullanılan operatör _yerine paket wilcard ithalatı için *operatörün kullanılmasıdır.

_Bunun yerine kullanmanın teknik bir nedeni var mı *? Değilse, bu değişiklik neden yapıldı?


Bu sadece işlevsel bir şey olabilir. Haskell'in, joker karakter / belirtilmemiş bir değer olarak hareket etmek için birkaç yerde _ kullandığını biliyorum.
KChaloux

Yanıtlar:


36

Scala'da, *geçerli bir tanımlayıcıdır. Birisi şöyle yazabilir:

val * = "trollin'"
println(*)

Sonuç olarak:

trollin'

Bu şekilde adlandırılan bir sınıf yazılabilir *:

class * {
  def test():String = {
    "trollin'"
  }
}

Bu durumda, *pakette bir sınıfım olduğunda us.hexcoderve yazarken:

import us.hexcoder.*

Bu adı taşıyan bir sınıfı içe aktarmak istediğinizi söylüyorsunuz *. Bu nedenle, Scala'nın joker karakter içe aktarmasını belirtmek için başka bir sembol kullanması gerekiyordu. Hangi nedenle olursa olsun _, joker sembolü olarak kullanmaya karar verdiler .


9
O zaman soru, neden * geçerli bir tanımlayıcı ve _ joker karakter olarak seçildi?
Mike Partridge

2
Daha fazla oyum olmasına rağmen, bu daha doğru cevap. * Daha önce tanımlayıcı olarak hiç duymadım.
Michael Brown

1
@MikeBrown Lisp için de geçerlidir. İşte Scheme'de

18
@MikePatridge Neredeyse kesinlikle Scala tüm operatörlerini fonksiyon olarak tanımlar ve geliştiricinin kendi operatörlerini bu şekilde tanımlamasına izin verir. Operatörler için özel durum sözdizimi yapmaz ve *çarpma işlemine dahil edilmesi gerekir. Bu nedenle, daha az yaygın olan bir karakterin ayrılmış bir karakter olarak seçilmesi gerekiyordu.
KChaloux

3
_ Karakteri boş ("boşluğu doldurun" gibi), bu yüzden Scala onu başka bir yerden ödünç aldıysa veya kendisiyle geldiyse, joker karakter olarak kullanmak mantıklıdır.
Michael Shaw

13

Fonksiyonel dillerde, _ karakteri genellikle "Bu parametreyi umursamıyorum" veya "her şey buraya gidebilir" demek için kullanılır. Bu değeri ad alanı içe aktarmalarına genişletmek sadece mantıklıdır.


2

Glenn'in cevabına ek olarak import, Scala'nın herhangi bir yerinde geçerli bir ifadedir ve importbir nesneyi veya bir örnek üyesini kapsama alabilirsiniz. Gibi *belli ki birçok sınıf üyesidir, bu bir joker olarak kullanılamaz importaçıklamada. Böylece, geçerli bir tanımlayıcı olmaması gereken bir dizeyle sonuçlanırsınız.

_akla gelir. Başka yerlerde farklı bir anlam (varoluşçu tip, örnek olarak işlev) için kullanılması da aynı sorundan kaynaklanmaktadır.


0

Scala'da alt çizginin kullanıldığı düzinelerce yer var . Joker karakterlerle içe aktarma için kullanmak sadece mantıklı bir sonuçtur.

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.