2014-10-10 20 views
9

Chcę porównać dwa ciągi w scala. na przykładJak porównać dwa ciągi znaków w scala?

My Strings to:

scala java 
scala java c++ 
scala c++ 

Chcę porównać ciąg

"scala C++" ze sobą ciągów

wyników należy,

scala c++ = scala java // false 
scala c++ = scala java c++ // false 
scala c++ = scala c++ // true 
+2

i jaki byłby przykład, który zwraca prawdę? –

+2

Dlaczego ostatni test ma zwrócić wartość "false"? –

Odpowiedz

21

W Scala można użyć == dla równości

scala> "scala c++" == "scala java" 
res0: Boolean = false 
scala> "scala c++" == "scala java c++" 
res1: Boolean = false 
scala> "scala c++" == "scala c++" 
res2: Boolean = true 

Metoda == jest zdefiniowana w klasie AnyRef. Ponieważ metody najpierw sprawdzają wartości puste, a następnie wywołują metodę równań na pierwszym obiekcie, aby zobaczyć, czy oba obiekty są równe, nie trzeba wykonywać specjalnej kontroli zerowej;

"test" == null 
res0: Boolean = false 

Zobacz Scala getting started guide i strings

Od "An Overview of the Scala Programming Language Second Edition";

„Działanie równości == pomiędzy wartościami ma być przezroczysty w odniesieniu do przedstawienia na typ. Dla wartości rodzaju, to naturalne (numeryczny lub logiczna) równości. Dla odniesienia typów == traktuje aliasu w równa metodę z java.lang.Object. metoda ta początkowo określany jako odniesienia równości ale ma być zastąpiona w podklas implementują naturalne pojęcie równości dla tych podklas. Na przykład: w pudełkowych wersjach typów wartości wprowadziłaby metodę równą, którą porównuje wartości w ramkach. Natomiast w Javie == zawsze oznacza równanie odniesienia w typach odniesienia. Chociaż jest to nieco bardziej wydajne w implementacji, wprowadza także poważny problem spójności , ponieważ wersje pudełkowe o równych wartościach mogą nie być już równe z względem ==. Niektóre sytuacje wymagają równości referencyjnej zamiast równości użytkownika. Przykładem jest hash-consing, gdzie esencja jest najważniejsza. W tych przypadkach, klasa AnyRef definiuje dodatkowy eq metody, które nie mogą być pominięte, a realizowany jest jako odniesienie równości (czyli zachowuje się jak == w Javie dla typów referencyjnych).”

+0

To jedno wyrafinowanie odbiera tyle bólu 'java'! – dmitry

0

przeciwieństwie Java, Scala używa doskonale niezmienne ciągi. Jak Olius wskazuje

Struny są niezmienne w Java i Scala.Scala używa ciągów Java, ale zawija je za pomocą StringOps lub WrappedString. "final" w Javie to w zasadzie taki sam jak "val" w Scali. W Scala, metoda == jest zdefiniowana w AnyRef w postaci .

W Scali wystarczy użyć operatora ==, aby porównać dwa ciągi.

Na przykład trzeba strings łańcuch1 i ciąg 2 można po prostu zrobić

string1 == string2 //=> true/false 

Co warto pamiętać jest to, że jeśli wartość ciągu nie jest przechowywany w val i po prostu lubią porównywać dwa, powinieneś używać podwójnych cudzysłowów do enkapsulacji wartości ciągu.

Na przykład:

"hello" == "hello" //=> true 
"hello" == "bye" //=> false 
+3

Ciągi są niezmienne w Javie i Scali. Scala używa ciągów Java, ale opakowuje je za pomocą StringOps lub WrappedString. "final" w Javie jest w zasadzie taki sam jak "val" w Scali. W Scali, metoda == jest zdefiniowana w AnyRef. – oluies

+0

@Oluies, racja. Dziękuję za wskazanie tego. Zaktualizuję odpowiedź. –

+0

Co masz na myśli przez "** W przeciwieństwie do Java **, Scala używa całkowicie niezmiennych ciągów"? Struny w Javie są również niezmienne. – MondKin