SlideShare ist ein Scribd-Unternehmen logo
1 von 59
ASSOCIATE EXPRESSIONS TO NAMES IN
SCALA
VAL, LAZY VAL, AND DEF
VAL
LAZY VAL
DEF
VAL
LAZY VAL
DEF
VAR
VAL
LAZY VAL
DEF
VAR
VAL
LAZY VAL
DEF
VAL
LAZY VAL
DEF
IN SCOPE
ACCESSED
ACCESSED
VAL
LAZY VAL
DEF
ONCE
ONCE
EVERY TIME
IN SCOPE
ACCESSED
ACCESSED
object Foo {
val v: String = {
println("v evaluated")
"result of v"
}
lazy val lv: String = {
println("lv evaluated")
"result of lv"
}
def d: String = {
println("d evaluated")
"result of d"
}
}
object Foo {
val v: String = {
println("v evaluated")
"result of v"
}
lazy val lv: String = {
println("lv evaluated")
"result of lv"
}
def d: String = {
println("d evaluated")
"result of d"
}
}
scala> Foo
object Foo {
val v: String = {
println("v evaluated")
"result of v"
}
lazy val lv: String = {
println("lv evaluated")
"result of lv"
}
def d: String = {
println("d evaluated")
"result of d"
}
}
scala> Foo
v evaluated
res0: Foo.type = Foo$@32f96bba
object Foo {
val v: String = {
println("v evaluated")
"result of v"
}
lazy val lv: String = {
println("lv evaluated")
"result of lv"
}
def d: String = {
println("d evaluated")
"result of d"
}
}
scala> Foo
v evaluated
res0: Foo.type = Foo$@32f96bba
scala> Foo.v
object Foo {
val v: String = {
println("v evaluated")
"result of v"
}
lazy val lv: String = {
println("lv evaluated")
"result of lv"
}
def d: String = {
println("d evaluated")
"result of d"
}
}
scala> Foo
v evaluated
res0: Foo.type = Foo$@32f96bba
scala> Foo.v
res1: String = result of v
object Foo {
val v: String = {
println("v evaluated")
"result of v"
}
lazy val lv: String = {
println("lv evaluated")
"result of lv"
}
def d: String = {
println("d evaluated")
"result of d"
}
}
scala> Foo
v evaluated
res0: Foo.type = Foo$@32f96bba
scala> Foo.v
res1: String = result of v
scala> Foo.lv
object Foo {
val v: String = {
println("v evaluated")
"result of v"
}
lazy val lv: String = {
println("lv evaluated")
"result of lv"
}
def d: String = {
println("d evaluated")
"result of d"
}
}
scala> Foo
v evaluated
res0: Foo.type = Foo$@32f96bba
scala> Foo.v
res1: String = result of v
scala> Foo.lv
lv evaluated
res2: String = result of lv
object Foo {
val v: String = {
println("v evaluated")
"result of v"
}
lazy val lv: String = {
println("lv evaluated")
"result of lv"
}
def d: String = {
println("d evaluated")
"result of d"
}
}
scala> Foo
v evaluated
res0: Foo.type = Foo$@32f96bba
scala> Foo.v
res1: String = result of v
scala> Foo.lv
lv evaluated
res2: String = result of lv
scala> Foo.lv
object Foo {
val v: String = {
println("v evaluated")
"result of v"
}
lazy val lv: String = {
println("lv evaluated")
"result of lv"
}
def d: String = {
println("d evaluated")
"result of d"
}
}
scala> Foo
v evaluated
res0: Foo.type = Foo$@32f96bba
scala> Foo.v
res1: String = result of v
scala> Foo.lv
lv evaluated
res2: String = result of lv
scala> Foo.lv
res3: String = result of lv
object Foo {
val v: String = {
println("v evaluated")
"result of v"
}
lazy val lv: String = {
println("lv evaluated")
"result of lv"
}
def d: String = {
println("d evaluated")
"result of d"
}
}
scala> Foo
v evaluated
res0: Foo.type = Foo$@32f96bba
scala> Foo.v
res1: String = result of v
scala> Foo.lv
lv evaluated
res2: String = result of lv
scala> Foo.lv
res3: String = result of lv
scala> Foo.d
object Foo {
val v: String = {
println("v evaluated")
"result of v"
}
lazy val lv: String = {
println("lv evaluated")
"result of lv"
}
def d: String = {
println("d evaluated")
"result of d"
}
}
scala> Foo
v evaluated
res0: Foo.type = Foo$@32f96bba
scala> Foo.v
res1: String = result of v
scala> Foo.lv
lv evaluated
res2: String = result of lv
scala> Foo.lv
res3: String = result of lv
scala> Foo.d
d evaluated
res4: String = result of d
object Foo {
val v: String = {
println("v evaluated")
"result of v"
}
lazy val lv: String = {
println("lv evaluated")
"result of lv"
}
def d: String = {
println("d evaluated")
"result of d"
}
}
scala> Foo
v evaluated
res0: Foo.type = Foo$@32f96bba
scala> Foo.v
res1: String = result of v
scala> Foo.lv
lv evaluated
res2: String = result of lv
scala> Foo.lv
res3: String = result of lv
scala> Foo.d
d evaluated
res4: String = result of d
scala> Foo.d
object Foo {
val v: String = {
println("v evaluated")
"result of v"
}
lazy val lv: String = {
println("lv evaluated")
"result of lv"
}
def d: String = {
println("d evaluated")
"result of d"
}
}
scala> Foo
v evaluated
res0: Foo.type = Foo$@32f96bba
scala> Foo.v
res1: String = result of v
scala> Foo.lv
lv evaluated
res2: String = result of lv
scala> Foo.lv
res3: String = result of lv
scala> Foo.d
d evaluated
res4: String = result of d
scala> Foo.d
d evaluated
res5: String = result of d
VARIABLE OVERRIDES IN INHERITANCE AND POLYMORPHISM
VAL
LAZY VAL
DEF
LAZY VAL VAL DEF
Overrides
Variable
VARIABLE OVERRIDES IN INHERITANCE AND POLYMORPHISM
VAL
LAZY VAL
DEF
LAZY VAL VAL DEF
Overrides
Variable
VARIABLE OVERRIDES IN INHERITANCE AND POLYMORPHISM
VAL
LAZY VAL
DEF
LAZY VAL VAL DEF
Overrides
Variable
VARIABLE OVERRIDES IN INHERITANCE AND POLYMORPHISM
VAL
LAZY VAL
DEF
LAZY VAL VAL DEF
Overrides
Variable
VARIABLE OVERRIDES IN INHERITANCE AND POLYMORPHISM
VAL
LAZY VAL
DEF
LAZY VAL VAL DEF
Overrides
Variable
VARIABLE OVERRIDES IN INHERITANCE AND POLYMORPHISM
VAL
LAZY VAL
DEF
LAZY VAL VAL DEF
Overrides
Variable
Only when parent Val is
not implemented
VARIABLE OVERRIDES IN INHERITANCE AND POLYMORPHISM
VAL
LAZY VAL
DEF
LAZY VAL VAL DEF
Overrides
Variable
Only when parent Val is
not implemented
Can Not Be Abstract
abstract class A {
val v: String
lazy val lv: String
def d: String
}
abstract class A {
val v: String
lazy val lv: String
def d: String
}
Can Not Be Abstract
abstract class A {
val v: String
lazy val lv: String = "value of lv in A"
def d: String
}
abstract class A {
val v: String
lazy val lv: String = "value of lv in A"
def d: String
}
class B extends A {
lazy val v: String = "value of v"
override lazy val lv: String = "value of lv"
lazy val d: String = "value of d"
}
abstract class A {
val v: String
lazy val lv: String = "value of lv in A"
def d: String
}
class B extends A {
lazy val v: String = "value of v"
override lazy val lv: String = "value of lv"
lazy val d: String = "value of d"
}
class C extends A {
val v: String = "value of v"
override lazy val lv: String = "value of lv"
val d: String = "value of d"
}
abstract class A {
val v: String
lazy val lv: String = "value of lv in A"
def d: String
}
class B extends A {
lazy val v: String = "value of v"
override lazy val lv: String = "value of lv"
lazy val d: String = "value of d"
}
class C extends A {
val v: String = "value of v"
override lazy val lv: String = "value of lv"
val d: String = "value of d"
}
class D extends A {
val v: String = "value of v"
override lazy val lv: String = "value of lv"
def d: String = "value of d"
}
abstract class A {
val x1: String
val x2: String = "mom"
val resultA = x1 + ", " + x2
}
class B extends A {
val x1: String = "hello"
val resultB = x1 + ", " + x2
}
class C extends B {
override val x2: String = "dad"
val resultC = x1 + ", " + x2
}
abstract class A {
val x1: String
val x2: String = "mom"
val resultA = x1 + ", " + x2
}
class B extends A {
val x1: String = "hello"
val resultB = x1 + ", " + x2
}
class C extends B {
override val x2: String = "dad"
val resultC = x1 + ", " + x2
}
scala> val c = new C
c: C = C@7cfb4736
abstract class A {
val x1: String
val x2: String = "mom"
val resultA = x1 + ", " + x2
}
class B extends A {
val x1: String = "hello"
val resultB = x1 + ", " + x2
}
class C extends B {
override val x2: String = "dad"
val resultC = x1 + ", " + x2
}
scala> val c = new C
c: C = C@7cfb4736
scala> c.resultC
res0: String = hello, dad
abstract class A {
val x1: String
val x2: String = "mom"
val resultA = x1 + ", " + x2
}
class B extends A {
val x1: String = "hello"
val resultB = x1 + ", " + x2
}
class C extends B {
override val x2: String = "dad"
val resultC = x1 + ", " + x2
}
scala> val c = new C
c: C = C@7cfb4736
scala> c.resultC
res0: String = hello, dad
scala> c.resultB
res1: String = hello, null
abstract class A {
val x1: String
val x2: String = "mom"
val resultA = x1 + ", " + x2
}
class B extends A {
val x1: String = "hello"
val resultB = x1 + ", " + x2
}
class C extends B {
override val x2: String = "dad"
val resultC = x1 + ", " + x2
}
scala> val c = new C
c: C = C@7cfb4736
scala> c.resultC
res0: String = hello, dad
scala> c.resultB
res1: String = hello, null
scala> c.resultA
res2: String = null, null
abstract class A {
val x1: String
val x2: String = "mom"
val resultA = x1 + ", " + x2
}
class B extends A {
val x1: String = "hello"
val resultB = x1 + ", " + x2
}
class C extends B {
override val x2: String = "dad"
val resultC = x1 + ", " + x2
}
scala> val c = new C
c: C = C@7cfb4736
scala> c.resultC
res0: String = C: hello, dad
scala> c.resultB
res1: String = B: hello, null
scala> c.resultA
res2: String = null, null
abstract class A {
val x1: String
val x2: String = "mom"
val resultA = x1 + ", " + x2
}
class B extends A {
val x1: String = "hello"
val resultB = x1 + ", " + x2
}
class C extends B {
override val x2: String = "dad"
val resultC = x1 + ", " + x2
}
scala> val c = new C
c: C = C@7cfb4736
scala> c.resultC
res0: String = hello, dad
scala> c.resultB
res1: String = hello, dad
scala> c.resultA
res2: String = hello, dad
INITIALIZATION ORDERS IN OVERRIDES
▸ Superclasses are fully initialized before subclasses.
▸ Otherwise, in declaration order
▸ When a `val` is overriden, it is not initialized more than once.
abstract class A {
val x1: String
val x2: String = "mom"
val resultA = x1 + ", " + x2
}
class B extends A {
val x1: String = "hello"
val resultB = x1 + ", " + x2
}
class C extends B {
override val x2: String = "dad"
val resultC = x1 + ", " + x2
}
scala> val c = new C
c: C = C@7cfb4736
scala> c.resultA
res0: String = null, null
abstract class A {
val x1: String
val x2: String = "mom"
val resultA = x1 + ", " + x2
}
class B extends A {
val x1: String = "hello"
val resultB = x1 + ", " + x2
}
class C extends B {
override val x2: String = "dad"
val resultC = x1 + ", " + x2
}
scala> val c = new C
c: C = C@7cfb4736
scala> c.resultA
res0: String = null, null
scala> c.resultB
res1: String = hello, null
abstract class A {
val x1: String
val x2: String = "mom"
val resultA = x1 + ", " + x2
}
class B extends A {
val x1: String = "hello"
val resultB = x1 + ", " + x2
}
class C extends B {
override val x2: String = "dad"
val resultC = x1 + ", " + x2
}
scala> val c = new C
c: C = C@7cfb4736
scala> c.resultA
res0: String = null, null
scala> c.resultB
res1: String = hello, null
scala> c.resultC
res2: String = hello, dad
abstract class D {
val c: C
val x3 = c.x1
}
class E extends D {
val c = new C
}
abstract class A {
val x1: String
val x2: String = "mom"
val resultA = x1 + ", " + x2
}
class B extends A {
val x1: String = "hello"
val resultB = x1 + ", " + x2
}
class C extends B {
override val x2: String = "dad"
val resultC = x1 + ", " + x2
}
abstract class D {
val c: C
val x3 = c.x1
}
class E extends D {
val c = new C
}
abstract class A {
val x1: String
val x2: String = "mom"
val resultA = x1 + ", " + x2
}
class B extends A {
val x1: String = "hello"
val resultB = x1 + ", " + x2
}
class C extends B {
override val x2: String = "dad"
val resultC = x1 + ", " + x2
}
scala> new E
abstract class D {
val c: C
val x3 = c.x1
}
class E extends D {
val c = new C
}
abstract class A {
val x1: String
val x2: String = "mom"
val resultA = x1 + ", " + x2
}
class B extends A {
val x1: String = "hello"
val resultB = x1 + ", " + x2
}
class C extends B {
override val x2: String = "dad"
val resultC = x1 + ", " + x2
}
scala> new E
java.lang.NullPointerException
... 30 elided
FIX 1 - USE EARLY DEFINITIONS
abstract class A {
val x1: String
val x2: String = "mom"
val resultA = x1 + ", " + x2
}
class B extends A {
val x1: String = "hello"
val resultB = x1 + ", " + x2
}
class C extends B {
override val x2: String = "dad"
val resultC = x1 + ", " + x2
}
abstract class A {
val x1: String
val x2: String = "mom"
val resultA = x1 + ", " + x2
}
class B extends {
val x1: String = "hello"
} with A {
val resultB = x1 + ", " + x2
}
class C extends {
override val x2: String = "dad"
} with B {
val resultC = x1 + ", " + x2
}
abstract class A {
val x1: String
val x2: String = "mom"
val resultA = x1 + ", " + x2
}
class B extends {
val x1: String = "hello"
} with A {
val resultB = x1 + ", " + x2
}
class C extends {
override val x2: String = "dad"
} with B {
val resultC = x1 + ", " + x2
}
scala> val c = new C
c: C = C@22d9bc14
scala> c.resultA
res0: String = hello, dad
scala> c.resultB
res1: String = hello, dad
scala> c.resultC
res2: String = hello, dad
abstract class A {
val x1: String
val x2: String = "mom"
val resultA = x1 + ", " + x2
}
class B extends {
val x1: String = "hello"
} with A {
val resultB = x1 + ", " + x2
}
class C extends {
override val x2: String = "dad"
} with B {
val resultC = x1 + ", " + x2
}
scala> val c = new C
c: C = C@22d9bc14
scala> c.resultA
res0: String = hello, dad
scala> c.resultB
res1: String = hello, dad
scala> c.resultC
res2: String = hello, dad
FIX 2 - USE LAZY VALS
abstract class A {
val x1: String
val x2: String = "mom"
val resultA = x1 + ", " + x2
}
class B extends A {
val x1: String = "hello"
val resultB = x1 + ", " + x2
}
class C extends B {
override val x2: String = "dad"
val resultC = x1 + ", " + x2
}
abstract class A {
val x1: String
val x2: String = "mom"
val resultA = x1 + ", " + x2
}
class B extends A {
val x1: String = "hello"
val resultB = x1 + ", " + x2
}
class C extends B {
override val x2: String = "dad"
val resultC = x1 + ", " + x2
}
abstract class A {
val x1: String
val x2: String = "mom"
val resultA = x1 + ", " + x2
}
class B extends A {
lazy val x1: String = "hello"
val resultB = x1 + ", " + x2
}
class C extends B {
override lazy val x2: String = "dad"
val resultC = x1 + ", " + x2
}
abstract class A {
val x1: String
val x2: String = "mom"
val resultA = x1 + ", " + x2
}
class B extends A {
val x1: String = "hello"
val resultB = x1 + ", " + x2
}
class C extends B {
override val x2: String = "dad"
val resultC = x1 + ", " + x2
}
abstract class A {
val x1: String
val x2: String = "mom"
val resultA = x1 + ", " + x2
}
class B extends A {
lazy val x1: String = "hello"
val resultB = x1 + ", " + x2
}
class C extends B {
override lazy val x2: String = "dad"
val resultC = x1 + ", " + x2
}
Only when parent Val is
not implemented
abstract class A {
val x1: String
val x2: String = "mom"
val resultA = x1 + ", " + x2
}
class B extends A {
val x1: String = "hello"
val resultB = x1 + ", " + x2
}
class C extends B {
override val x2: String = "dad"
val resultC = x1 + ", " + x2
}
abstract class A {
val x1: String
lazy val x2: String = "mom"
val resultA = x1 + ", " + x2
}
class B extends A {
lazy val x1: String = "hello"
val resultB = x1 + ", " + x2
}
class C extends B {
override lazy val x2: String = "dad"
val resultC = x1 + ", " + x2
}
abstract class A {
val x1: String
lazy val x2: String = "mom"
val resultA = x1 + ", " + x2
}
class B extends A {
lazy val x1: String = "hello"
val resultB = x1 + ", " + x2
}
class C extends B {
override lazy val x2: String = "dad"
val resultC = x1 + ", " + x2
}
scala> val c = new C
c: C = C@2f74900b
scala> c.resultA
res0: String = hello, dad
scala> c.resultB
res1: String = hello, dad
scala> c.resultC
res2: String = hello, dad
abstract class A {
val x1: String
lazy val x2: String = "mom"
val resultA = x1 + ", " + x2
}
class B extends A {
lazy val x1: String = "hello"
val resultB = x1 + ", " + x2
}
class C extends B {
override lazy val x2: String = "dad"
val resultC = x1 + ", " + x2
}
scala> val c = new C
c: C = C@2f74900b
scala> c.resultA
res0: String = hello, dad
scala> c.resultB
res1: String = hello, dad
scala> c.resultC
res2: String = hello, dad
THANK YOU!
References: https://docs.scala-lang.org/tutorials/FAQ/initialization-order.html
@realstraw
in/kexinxie

Weitere ähnliche Inhalte

Ähnlich wie Assiciate Expressions to Names in Scala

pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
Hiroshi Ono
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
Hiroshi Ono
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
Hiroshi Ono
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
Hiroshi Ono
 

Ähnlich wie Assiciate Expressions to Names in Scala (20)

Kotlin Basics - Apalon Kotlin Sprint Part 2
Kotlin Basics - Apalon Kotlin Sprint Part 2Kotlin Basics - Apalon Kotlin Sprint Part 2
Kotlin Basics - Apalon Kotlin Sprint Part 2
 
Scala 101
Scala 101Scala 101
Scala 101
 
redis überall
redis überallredis überall
redis überall
 
Scala Quick Introduction
Scala Quick IntroductionScala Quick Introduction
Scala Quick Introduction
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 
RxSwift 시작하기
RxSwift 시작하기RxSwift 시작하기
RxSwift 시작하기
 
Kotlin : Advanced Tricks - Ubiratan Soares
Kotlin : Advanced Tricks - Ubiratan SoaresKotlin : Advanced Tricks - Ubiratan Soares
Kotlin : Advanced Tricks - Ubiratan Soares
 
Laziness in Swift
Laziness in Swift Laziness in Swift
Laziness in Swift
 
Scala Intro
Scala IntroScala Intro
Scala Intro
 
“SOLID principles in PHP – how to apply them in PHP and why should we care“ b...
“SOLID principles in PHP – how to apply them in PHP and why should we care“ b...“SOLID principles in PHP – how to apply them in PHP and why should we care“ b...
“SOLID principles in PHP – how to apply them in PHP and why should we care“ b...
 
Introduction to programming in scala
Introduction to programming in scalaIntroduction to programming in scala
Introduction to programming in scala
 
SDC - Einführung in Scala
SDC - Einführung in ScalaSDC - Einführung in Scala
SDC - Einführung in Scala
 
Object Equality in Scala
Object Equality in ScalaObject Equality in Scala
Object Equality in Scala
 
ddd+scala
ddd+scaladdd+scala
ddd+scala
 
Concurrent Application Development using Scala
Concurrent Application Development using ScalaConcurrent Application Development using Scala
Concurrent Application Development using Scala
 
Switching from java to groovy
Switching from java to groovySwitching from java to groovy
Switching from java to groovy
 
Introduction to Scala
Introduction to ScalaIntroduction to Scala
Introduction to Scala
 

Kürzlich hochgeladen

Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak HamilCara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
Cara Menggugurkan Kandungan 087776558899
 
Integrated Test Rig For HTFE-25 - Neometrix
Integrated Test Rig For HTFE-25 - NeometrixIntegrated Test Rig For HTFE-25 - Neometrix
Integrated Test Rig For HTFE-25 - Neometrix
Neometrix_Engineering_Pvt_Ltd
 
Kuwait City MTP kit ((+919101817206)) Buy Abortion Pills Kuwait
Kuwait City MTP kit ((+919101817206)) Buy Abortion Pills KuwaitKuwait City MTP kit ((+919101817206)) Buy Abortion Pills Kuwait
Kuwait City MTP kit ((+919101817206)) Buy Abortion Pills Kuwait
jaanualu31
 

Kürzlich hochgeladen (20)

Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak HamilCara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
 
Integrated Test Rig For HTFE-25 - Neometrix
Integrated Test Rig For HTFE-25 - NeometrixIntegrated Test Rig For HTFE-25 - Neometrix
Integrated Test Rig For HTFE-25 - Neometrix
 
Bhubaneswar🌹Call Girls Bhubaneswar ❤Komal 9777949614 💟 Full Trusted CALL GIRL...
Bhubaneswar🌹Call Girls Bhubaneswar ❤Komal 9777949614 💟 Full Trusted CALL GIRL...Bhubaneswar🌹Call Girls Bhubaneswar ❤Komal 9777949614 💟 Full Trusted CALL GIRL...
Bhubaneswar🌹Call Girls Bhubaneswar ❤Komal 9777949614 💟 Full Trusted CALL GIRL...
 
Hostel management system project report..pdf
Hostel management system project report..pdfHostel management system project report..pdf
Hostel management system project report..pdf
 
Online electricity billing project report..pdf
Online electricity billing project report..pdfOnline electricity billing project report..pdf
Online electricity billing project report..pdf
 
Kuwait City MTP kit ((+919101817206)) Buy Abortion Pills Kuwait
Kuwait City MTP kit ((+919101817206)) Buy Abortion Pills KuwaitKuwait City MTP kit ((+919101817206)) Buy Abortion Pills Kuwait
Kuwait City MTP kit ((+919101817206)) Buy Abortion Pills Kuwait
 
data_management_and _data_science_cheat_sheet.pdf
data_management_and _data_science_cheat_sheet.pdfdata_management_and _data_science_cheat_sheet.pdf
data_management_and _data_science_cheat_sheet.pdf
 
Online food ordering system project report.pdf
Online food ordering system project report.pdfOnline food ordering system project report.pdf
Online food ordering system project report.pdf
 
2016EF22_0 solar project report rooftop projects
2016EF22_0 solar project report rooftop projects2016EF22_0 solar project report rooftop projects
2016EF22_0 solar project report rooftop projects
 
HAND TOOLS USED AT ELECTRONICS WORK PRESENTED BY KOUSTAV SARKAR
HAND TOOLS USED AT ELECTRONICS WORK PRESENTED BY KOUSTAV SARKARHAND TOOLS USED AT ELECTRONICS WORK PRESENTED BY KOUSTAV SARKAR
HAND TOOLS USED AT ELECTRONICS WORK PRESENTED BY KOUSTAV SARKAR
 
Double Revolving field theory-how the rotor develops torque
Double Revolving field theory-how the rotor develops torqueDouble Revolving field theory-how the rotor develops torque
Double Revolving field theory-how the rotor develops torque
 
Minimum and Maximum Modes of microprocessor 8086
Minimum and Maximum Modes of microprocessor 8086Minimum and Maximum Modes of microprocessor 8086
Minimum and Maximum Modes of microprocessor 8086
 
Hazard Identification (HAZID) vs. Hazard and Operability (HAZOP): A Comparati...
Hazard Identification (HAZID) vs. Hazard and Operability (HAZOP): A Comparati...Hazard Identification (HAZID) vs. Hazard and Operability (HAZOP): A Comparati...
Hazard Identification (HAZID) vs. Hazard and Operability (HAZOP): A Comparati...
 
Navigating Complexity: The Role of Trusted Partners and VIAS3D in Dassault Sy...
Navigating Complexity: The Role of Trusted Partners and VIAS3D in Dassault Sy...Navigating Complexity: The Role of Trusted Partners and VIAS3D in Dassault Sy...
Navigating Complexity: The Role of Trusted Partners and VIAS3D in Dassault Sy...
 
kiln thermal load.pptx kiln tgermal load
kiln thermal load.pptx kiln tgermal loadkiln thermal load.pptx kiln tgermal load
kiln thermal load.pptx kiln tgermal load
 
AIRCANVAS[1].pdf mini project for btech students
AIRCANVAS[1].pdf mini project for btech studentsAIRCANVAS[1].pdf mini project for btech students
AIRCANVAS[1].pdf mini project for btech students
 
Employee leave management system project.
Employee leave management system project.Employee leave management system project.
Employee leave management system project.
 
Generative AI or GenAI technology based PPT
Generative AI or GenAI technology based PPTGenerative AI or GenAI technology based PPT
Generative AI or GenAI technology based PPT
 
FEA Based Level 3 Assessment of Deformed Tanks with Fluid Induced Loads
FEA Based Level 3 Assessment of Deformed Tanks with Fluid Induced LoadsFEA Based Level 3 Assessment of Deformed Tanks with Fluid Induced Loads
FEA Based Level 3 Assessment of Deformed Tanks with Fluid Induced Loads
 
DC MACHINE-Motoring and generation, Armature circuit equation
DC MACHINE-Motoring and generation, Armature circuit equationDC MACHINE-Motoring and generation, Armature circuit equation
DC MACHINE-Motoring and generation, Armature circuit equation
 

Assiciate Expressions to Names in Scala

  • 1. ASSOCIATE EXPRESSIONS TO NAMES IN SCALA VAL, LAZY VAL, AND DEF
  • 8. object Foo { val v: String = { println("v evaluated") "result of v" } lazy val lv: String = { println("lv evaluated") "result of lv" } def d: String = { println("d evaluated") "result of d" } }
  • 9. object Foo { val v: String = { println("v evaluated") "result of v" } lazy val lv: String = { println("lv evaluated") "result of lv" } def d: String = { println("d evaluated") "result of d" } } scala> Foo
  • 10. object Foo { val v: String = { println("v evaluated") "result of v" } lazy val lv: String = { println("lv evaluated") "result of lv" } def d: String = { println("d evaluated") "result of d" } } scala> Foo v evaluated res0: Foo.type = Foo$@32f96bba
  • 11. object Foo { val v: String = { println("v evaluated") "result of v" } lazy val lv: String = { println("lv evaluated") "result of lv" } def d: String = { println("d evaluated") "result of d" } } scala> Foo v evaluated res0: Foo.type = Foo$@32f96bba scala> Foo.v
  • 12. object Foo { val v: String = { println("v evaluated") "result of v" } lazy val lv: String = { println("lv evaluated") "result of lv" } def d: String = { println("d evaluated") "result of d" } } scala> Foo v evaluated res0: Foo.type = Foo$@32f96bba scala> Foo.v res1: String = result of v
  • 13. object Foo { val v: String = { println("v evaluated") "result of v" } lazy val lv: String = { println("lv evaluated") "result of lv" } def d: String = { println("d evaluated") "result of d" } } scala> Foo v evaluated res0: Foo.type = Foo$@32f96bba scala> Foo.v res1: String = result of v scala> Foo.lv
  • 14. object Foo { val v: String = { println("v evaluated") "result of v" } lazy val lv: String = { println("lv evaluated") "result of lv" } def d: String = { println("d evaluated") "result of d" } } scala> Foo v evaluated res0: Foo.type = Foo$@32f96bba scala> Foo.v res1: String = result of v scala> Foo.lv lv evaluated res2: String = result of lv
  • 15. object Foo { val v: String = { println("v evaluated") "result of v" } lazy val lv: String = { println("lv evaluated") "result of lv" } def d: String = { println("d evaluated") "result of d" } } scala> Foo v evaluated res0: Foo.type = Foo$@32f96bba scala> Foo.v res1: String = result of v scala> Foo.lv lv evaluated res2: String = result of lv scala> Foo.lv
  • 16. object Foo { val v: String = { println("v evaluated") "result of v" } lazy val lv: String = { println("lv evaluated") "result of lv" } def d: String = { println("d evaluated") "result of d" } } scala> Foo v evaluated res0: Foo.type = Foo$@32f96bba scala> Foo.v res1: String = result of v scala> Foo.lv lv evaluated res2: String = result of lv scala> Foo.lv res3: String = result of lv
  • 17. object Foo { val v: String = { println("v evaluated") "result of v" } lazy val lv: String = { println("lv evaluated") "result of lv" } def d: String = { println("d evaluated") "result of d" } } scala> Foo v evaluated res0: Foo.type = Foo$@32f96bba scala> Foo.v res1: String = result of v scala> Foo.lv lv evaluated res2: String = result of lv scala> Foo.lv res3: String = result of lv scala> Foo.d
  • 18. object Foo { val v: String = { println("v evaluated") "result of v" } lazy val lv: String = { println("lv evaluated") "result of lv" } def d: String = { println("d evaluated") "result of d" } } scala> Foo v evaluated res0: Foo.type = Foo$@32f96bba scala> Foo.v res1: String = result of v scala> Foo.lv lv evaluated res2: String = result of lv scala> Foo.lv res3: String = result of lv scala> Foo.d d evaluated res4: String = result of d
  • 19. object Foo { val v: String = { println("v evaluated") "result of v" } lazy val lv: String = { println("lv evaluated") "result of lv" } def d: String = { println("d evaluated") "result of d" } } scala> Foo v evaluated res0: Foo.type = Foo$@32f96bba scala> Foo.v res1: String = result of v scala> Foo.lv lv evaluated res2: String = result of lv scala> Foo.lv res3: String = result of lv scala> Foo.d d evaluated res4: String = result of d scala> Foo.d
  • 20. object Foo { val v: String = { println("v evaluated") "result of v" } lazy val lv: String = { println("lv evaluated") "result of lv" } def d: String = { println("d evaluated") "result of d" } } scala> Foo v evaluated res0: Foo.type = Foo$@32f96bba scala> Foo.v res1: String = result of v scala> Foo.lv lv evaluated res2: String = result of lv scala> Foo.lv res3: String = result of lv scala> Foo.d d evaluated res4: String = result of d scala> Foo.d d evaluated res5: String = result of d
  • 21. VARIABLE OVERRIDES IN INHERITANCE AND POLYMORPHISM VAL LAZY VAL DEF LAZY VAL VAL DEF Overrides Variable
  • 22. VARIABLE OVERRIDES IN INHERITANCE AND POLYMORPHISM VAL LAZY VAL DEF LAZY VAL VAL DEF Overrides Variable
  • 23. VARIABLE OVERRIDES IN INHERITANCE AND POLYMORPHISM VAL LAZY VAL DEF LAZY VAL VAL DEF Overrides Variable
  • 24. VARIABLE OVERRIDES IN INHERITANCE AND POLYMORPHISM VAL LAZY VAL DEF LAZY VAL VAL DEF Overrides Variable
  • 25. VARIABLE OVERRIDES IN INHERITANCE AND POLYMORPHISM VAL LAZY VAL DEF LAZY VAL VAL DEF Overrides Variable
  • 26. VARIABLE OVERRIDES IN INHERITANCE AND POLYMORPHISM VAL LAZY VAL DEF LAZY VAL VAL DEF Overrides Variable Only when parent Val is not implemented
  • 27. VARIABLE OVERRIDES IN INHERITANCE AND POLYMORPHISM VAL LAZY VAL DEF LAZY VAL VAL DEF Overrides Variable Only when parent Val is not implemented Can Not Be Abstract
  • 28. abstract class A { val v: String lazy val lv: String def d: String }
  • 29. abstract class A { val v: String lazy val lv: String def d: String } Can Not Be Abstract
  • 30. abstract class A { val v: String lazy val lv: String = "value of lv in A" def d: String }
  • 31. abstract class A { val v: String lazy val lv: String = "value of lv in A" def d: String } class B extends A { lazy val v: String = "value of v" override lazy val lv: String = "value of lv" lazy val d: String = "value of d" }
  • 32. abstract class A { val v: String lazy val lv: String = "value of lv in A" def d: String } class B extends A { lazy val v: String = "value of v" override lazy val lv: String = "value of lv" lazy val d: String = "value of d" } class C extends A { val v: String = "value of v" override lazy val lv: String = "value of lv" val d: String = "value of d" }
  • 33. abstract class A { val v: String lazy val lv: String = "value of lv in A" def d: String } class B extends A { lazy val v: String = "value of v" override lazy val lv: String = "value of lv" lazy val d: String = "value of d" } class C extends A { val v: String = "value of v" override lazy val lv: String = "value of lv" val d: String = "value of d" } class D extends A { val v: String = "value of v" override lazy val lv: String = "value of lv" def d: String = "value of d" }
  • 34. abstract class A { val x1: String val x2: String = "mom" val resultA = x1 + ", " + x2 } class B extends A { val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override val x2: String = "dad" val resultC = x1 + ", " + x2 }
  • 35. abstract class A { val x1: String val x2: String = "mom" val resultA = x1 + ", " + x2 } class B extends A { val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override val x2: String = "dad" val resultC = x1 + ", " + x2 } scala> val c = new C c: C = C@7cfb4736
  • 36. abstract class A { val x1: String val x2: String = "mom" val resultA = x1 + ", " + x2 } class B extends A { val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override val x2: String = "dad" val resultC = x1 + ", " + x2 } scala> val c = new C c: C = C@7cfb4736 scala> c.resultC res0: String = hello, dad
  • 37. abstract class A { val x1: String val x2: String = "mom" val resultA = x1 + ", " + x2 } class B extends A { val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override val x2: String = "dad" val resultC = x1 + ", " + x2 } scala> val c = new C c: C = C@7cfb4736 scala> c.resultC res0: String = hello, dad scala> c.resultB res1: String = hello, null
  • 38. abstract class A { val x1: String val x2: String = "mom" val resultA = x1 + ", " + x2 } class B extends A { val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override val x2: String = "dad" val resultC = x1 + ", " + x2 } scala> val c = new C c: C = C@7cfb4736 scala> c.resultC res0: String = hello, dad scala> c.resultB res1: String = hello, null scala> c.resultA res2: String = null, null
  • 39. abstract class A { val x1: String val x2: String = "mom" val resultA = x1 + ", " + x2 } class B extends A { val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override val x2: String = "dad" val resultC = x1 + ", " + x2 } scala> val c = new C c: C = C@7cfb4736 scala> c.resultC res0: String = C: hello, dad scala> c.resultB res1: String = B: hello, null scala> c.resultA res2: String = null, null
  • 40. abstract class A { val x1: String val x2: String = "mom" val resultA = x1 + ", " + x2 } class B extends A { val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override val x2: String = "dad" val resultC = x1 + ", " + x2 } scala> val c = new C c: C = C@7cfb4736 scala> c.resultC res0: String = hello, dad scala> c.resultB res1: String = hello, dad scala> c.resultA res2: String = hello, dad
  • 41. INITIALIZATION ORDERS IN OVERRIDES ▸ Superclasses are fully initialized before subclasses. ▸ Otherwise, in declaration order ▸ When a `val` is overriden, it is not initialized more than once.
  • 42. abstract class A { val x1: String val x2: String = "mom" val resultA = x1 + ", " + x2 } class B extends A { val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override val x2: String = "dad" val resultC = x1 + ", " + x2 } scala> val c = new C c: C = C@7cfb4736 scala> c.resultA res0: String = null, null
  • 43. abstract class A { val x1: String val x2: String = "mom" val resultA = x1 + ", " + x2 } class B extends A { val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override val x2: String = "dad" val resultC = x1 + ", " + x2 } scala> val c = new C c: C = C@7cfb4736 scala> c.resultA res0: String = null, null scala> c.resultB res1: String = hello, null
  • 44. abstract class A { val x1: String val x2: String = "mom" val resultA = x1 + ", " + x2 } class B extends A { val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override val x2: String = "dad" val resultC = x1 + ", " + x2 } scala> val c = new C c: C = C@7cfb4736 scala> c.resultA res0: String = null, null scala> c.resultB res1: String = hello, null scala> c.resultC res2: String = hello, dad
  • 45. abstract class D { val c: C val x3 = c.x1 } class E extends D { val c = new C } abstract class A { val x1: String val x2: String = "mom" val resultA = x1 + ", " + x2 } class B extends A { val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override val x2: String = "dad" val resultC = x1 + ", " + x2 }
  • 46. abstract class D { val c: C val x3 = c.x1 } class E extends D { val c = new C } abstract class A { val x1: String val x2: String = "mom" val resultA = x1 + ", " + x2 } class B extends A { val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override val x2: String = "dad" val resultC = x1 + ", " + x2 } scala> new E
  • 47. abstract class D { val c: C val x3 = c.x1 } class E extends D { val c = new C } abstract class A { val x1: String val x2: String = "mom" val resultA = x1 + ", " + x2 } class B extends A { val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override val x2: String = "dad" val resultC = x1 + ", " + x2 } scala> new E java.lang.NullPointerException ... 30 elided
  • 48. FIX 1 - USE EARLY DEFINITIONS
  • 49. abstract class A { val x1: String val x2: String = "mom" val resultA = x1 + ", " + x2 } class B extends A { val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override val x2: String = "dad" val resultC = x1 + ", " + x2 } abstract class A { val x1: String val x2: String = "mom" val resultA = x1 + ", " + x2 } class B extends { val x1: String = "hello" } with A { val resultB = x1 + ", " + x2 } class C extends { override val x2: String = "dad" } with B { val resultC = x1 + ", " + x2 }
  • 50. abstract class A { val x1: String val x2: String = "mom" val resultA = x1 + ", " + x2 } class B extends { val x1: String = "hello" } with A { val resultB = x1 + ", " + x2 } class C extends { override val x2: String = "dad" } with B { val resultC = x1 + ", " + x2 } scala> val c = new C c: C = C@22d9bc14 scala> c.resultA res0: String = hello, dad scala> c.resultB res1: String = hello, dad scala> c.resultC res2: String = hello, dad
  • 51. abstract class A { val x1: String val x2: String = "mom" val resultA = x1 + ", " + x2 } class B extends { val x1: String = "hello" } with A { val resultB = x1 + ", " + x2 } class C extends { override val x2: String = "dad" } with B { val resultC = x1 + ", " + x2 } scala> val c = new C c: C = C@22d9bc14 scala> c.resultA res0: String = hello, dad scala> c.resultB res1: String = hello, dad scala> c.resultC res2: String = hello, dad
  • 52. FIX 2 - USE LAZY VALS
  • 53. abstract class A { val x1: String val x2: String = "mom" val resultA = x1 + ", " + x2 } class B extends A { val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override val x2: String = "dad" val resultC = x1 + ", " + x2 }
  • 54. abstract class A { val x1: String val x2: String = "mom" val resultA = x1 + ", " + x2 } class B extends A { val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override val x2: String = "dad" val resultC = x1 + ", " + x2 } abstract class A { val x1: String val x2: String = "mom" val resultA = x1 + ", " + x2 } class B extends A { lazy val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override lazy val x2: String = "dad" val resultC = x1 + ", " + x2 }
  • 55. abstract class A { val x1: String val x2: String = "mom" val resultA = x1 + ", " + x2 } class B extends A { val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override val x2: String = "dad" val resultC = x1 + ", " + x2 } abstract class A { val x1: String val x2: String = "mom" val resultA = x1 + ", " + x2 } class B extends A { lazy val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override lazy val x2: String = "dad" val resultC = x1 + ", " + x2 } Only when parent Val is not implemented
  • 56. abstract class A { val x1: String val x2: String = "mom" val resultA = x1 + ", " + x2 } class B extends A { val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override val x2: String = "dad" val resultC = x1 + ", " + x2 } abstract class A { val x1: String lazy val x2: String = "mom" val resultA = x1 + ", " + x2 } class B extends A { lazy val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override lazy val x2: String = "dad" val resultC = x1 + ", " + x2 }
  • 57. abstract class A { val x1: String lazy val x2: String = "mom" val resultA = x1 + ", " + x2 } class B extends A { lazy val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override lazy val x2: String = "dad" val resultC = x1 + ", " + x2 } scala> val c = new C c: C = C@2f74900b scala> c.resultA res0: String = hello, dad scala> c.resultB res1: String = hello, dad scala> c.resultC res2: String = hello, dad
  • 58. abstract class A { val x1: String lazy val x2: String = "mom" val resultA = x1 + ", " + x2 } class B extends A { lazy val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override lazy val x2: String = "dad" val resultC = x1 + ", " + x2 } scala> val c = new C c: C = C@2f74900b scala> c.resultA res0: String = hello, dad scala> c.resultB res1: String = hello, dad scala> c.resultC res2: String = hello, dad