0 امتیاز
قبل در برنامه نویسی توسط (1.1هزار امتیاز)
ویرایش شده قبل توسط

تفاوت یک تابع در Scala که با def تعریف می شود با تابعی که بصورت anonymous تعریف می شود و در یک val ذخیره می شود چیست؟

  val f1: (Int) => Int = x => x*x*x
//or
  val f1 = ((x : Int) => x*x*x)

  def f2(x: Int) = x*x*x

هر دو تابع فوق را می توان به یک Higher-order function بعنوان پارمتر ارسال کرد.

2 پاسخ

0 امتیاز
قبل توسط (1.1هزار امتیاز)
 
بهترین پاسخ

متدی که با val تعریف می شود در زمان تعریف evaluate می شود.

متدی که با def تعریف می شود در هر بار فراخوانی evaluate می شود. به عبارت دیگر در هر بار فراخوانی متدی که با def تعریف می شود یک instance جدید از Function1 ساخته و فراخوانی می شود.

val test: () => Int = {
  val r = util.Random.nextInt
  () => r
}

test()
// Int = -1049057402
test()
// Int = -1049057402 - same result

def test: () => Int = {
  val r = util.Random.nextInt
  () => r
}

test()
// Int = -240885810
test()
// Int = -1002157461 - new result
+1 امتیاز
قبل توسط (1.2هزار امتیاز)
در عمل تفاوتی ندارند اما یک نکته ظریف اینکه هرچیزی که با val تعریف میشه فقط یکبار مقدار دهی میشه ولی هرچیزی که با def تعریف بشه در هربار فراخوانی initialize یا مقدار دهی میشه.

سوالات مشابه

0 امتیاز
1 پاسخ 274 بازدید
سوال شده 9 سال قبل در برنامه نویسی توسط Saeed Zarinfam (1.1هزار امتیاز)
+1 امتیاز
1 پاسخ 320 بازدید
0 امتیاز
1 پاسخ 543 بازدید
0 امتیاز
1 پاسخ 311 بازدید
0 امتیاز
1 پاسخ 514 بازدید
0 امتیاز
0 پاسخ 593 بازدید
0 امتیاز
0 پاسخ 806 بازدید
0 امتیاز
1 پاسخ 471 بازدید
...