لماذا لا تستطيع SCALAC تحسين العودية الذيل في سيناريوهات معينة؟
-
18-09-2019 - |
سؤال
لماذا لا 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.
لا تنتمي إلى StackOverflow