私はスカラを学習し、基礎を上っています。「スカラ==と!=メソッドでは、参照平等をチェックするJavaとは対照的に、値equaliyをチェックします」
「Scalaでは==と!=メソッドは、Javaとは対照的に、参照equalityをチェックする値equaliyをチェックする」という意味を理解できませんでした。
誰かが例を挙げて、簡単に英語で説明しようとすることができますか?
私はスカラを学習し、基礎を上っています。「スカラ==と!=メソッドでは、参照平等をチェックするJavaとは対照的に、値equaliyをチェックします」
「Scalaでは==と!=メソッドは、Javaとは対照的に、参照equalityをチェックする値equaliyをチェックする」という意味を理解できませんでした。
誰かが例を挙げて、簡単に英語で説明しようとすることができますか?
AnyVal
)とスカラ座での値クラスでcase classes、==
と!=
は、値のチェックを行います。
値クラスは、インスタンスが というオブジェクトの下にあるホストシステムによって表されないクラスです。すべての値クラスは クラスのAnyValを継承します。
スカラーのすべてのプリミティブInt
,Float
などは値クラスです。 case classes
と
scala> val quantity1 = 100
quantity1: Int = 100
scala> val quantity2 = 100
quantity2: Int = 100
scala> quantity1 == quantity2
res9: Boolean = true
は、==
implicitily動作します。、
ケースクラスが が独占的に自分のコンストラクタの引数に依存すべき平野と不変のデータ保持オブジェクトである
scala> case class Item(name: String, quantity: Int)
defined class Item
今、==
で2つの項目を比較すると、itemは同じ。
scala> Item("Jacket", 100) == Item("Pants", 10)
res0: Boolean = false
scala> Item("Jacket", 100) == Item("Jacket", 100)
res1: Boolean = true
AnyRef
)とJavaクラス(java.lang.Object
)しかし、あなたは==
をすればRef
ScalaでのクラスおよびすべてのJavaクラスと、それはインスタンスの参照をチェックする代わりに、値は自分で書くまでequals methodです。
static class Item {
String name;
int quantity;
Item(String name, int quantity){
this.name = name;
this.quantity = quantity;
}
}
public static void main(String[] args) {
Item item1 = new Item("Jacket", 100);
Item item2 = new Item("Pants", 10);
Item item3 = new Item("Jacket", 100);
System.out.println(item1 +"==" + item2 + " " + (item1 == item2)); //false
System.out.println(item1 +"==" + item3 + " " + (item1 == item3)); //false
}
==
比較結果が1b28cdfa
がitem1
のインスタンスREFある
[email protected][email protected] false
[email protected][email protected] false
あろう。 item1
とitem3
は同じデータを持っていますが、==
は2つの異なるアドレスを参照する2つの異なるインスタンスであるため、falseを返します。
値クラス==
のスカラーを模倣するには、以下のようにequals
メソッドを実装し、手動等価チェックを実行します。
static class Item {
String name;
int quantity;
Item(String name, int quantity){
this.name = name;
this.quantity = quantity;
}
@Override
public boolean equals(Object obj) {
Item i = (Item) obj;
return this.name.equals(((Item) obj).name) && this.quantity == ((Item) obj).quantity;
}
}
public static void main(String[] args) {
Item item1 = new Item("Jacket", 100);
Item item2 = new Item("Pants", 10);
Item item3 = new Item("Jacket", 100);
System.out.println(item1 +".equals(" + item3 + ") " + (item1.equals(item3))); //true
}
方法は
scala> class Store(name: String){} //equivalent to Store extends `AnyRef`
defined class Store
scala> val store1 = new Store("a")
store1: Store = [email protected]
scala> val store2 = new Store("a")
store2: Store = [email protected]
scala> store1 == store2
res7: Boolean = false
を実装しかし、Scalaの文献のクラスで独自のequals
方法がありますならば、==を意味していないに等しい場合、 `==は`参照を比較することをScalaの参考クラスと同じ
.equals
メソッド。例、あなたがこれらの条件をGoogleにしたい
scala> :paste
// Entering paste mode (ctrl-D to finish)
class Store(val name: String){
override def equals(that: Any) : Boolean = {
val thatStore = that.asInstanceOf[Store]
name == thatStore.name
}
}
scala> new Store("JWN") == new Store("JWN") // calls s1.equals(s2)
res1: Boolean = true
。基本的なことがすべて説明されています。 – GhostCat
たとえば、[Javaでは== vs equals()の違いは何ですか]と考えてみてください(詳細は、/ questions/7520432/what-is-the-the-difference-vs-equals-in-java) –