لماذا لا تستطيع SCALAC تحسين العودية الذيل في سيناريوهات معينة؟

StackOverflow https://stackoverflow.com/questions/1699376

سؤال

لماذا لا scalac ( سكالا مترجم) تحسين إكمال الذيل؟

الدعوات الرمز ومبرم البرمجيات التي توضح هذا:

> Cat Foo.Scala Class Foo {def ifak (n: int، acc: int): int = {if (n == 1) acc آخر IFAK (n-1، n * acc)}}> Scalac Foo.Scala> JD-GUI FOO.CLASS استيراد Scala.scalaobject؛ الفئة العامة فو تنفذ scalaobject {public int ifak (int n، int acc) {العودة ((n == 1)؟ acc: IFAK (n - 1، n * acc))؛ }}
هل كانت مفيدة؟

المحلول

الأساليب التي يمكن تجاوزها لا يمكن أن تكون الذيل العودية. جرب هذا:

class Foo {
  private def ifak(n: Int, acc: Int): Int = {  
    if (n == 1) acc  
    else ifak(n-1, n*acc)  
  }
}

نصائح أخرى

جرب هذا:

class Foo {
  def ifak(n: Int, acc: Int):Int = {
    if (n == 1) acc
    else ifak(n-1, n*acc)
  }
}

class Bar extends Foo {
  override def ifak(n: Int, acc: Int): Int = {
    println("Bar!")
    super.ifak(n, acc)
  }
}

val foobar = new Bar
foobar.ifak(5, 1)

لاحظ أن ifak مايو أن تكرر، ولكن قد لا كذلك. حدد الفصل أو نهائي الطريقة، وربما جعل الذيل العريض.

الوظائف الداخلية مؤهلة أيضا للحصول على TCO.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top